Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамические потоки  (Прочитано 7163 раз)
0 Пользователей и 1 Гость смотрят эту тему.
oktonion
Участник

ru
Offline Offline

« : 09-11-2010 19:56 » 

Пишу в билдере шестом, возникла необходимость создания потоков, при том изначально количество потоков неизвестно.
К сожалению поиск по просторам интернета дал весьма скудную информацию.

Попытался сам что то сделать, но пока что работает криво:
Код:
static DWORD __stdcall ThreadFunc (LPVOID i )
{
 AnsiString a;
 a=IntToStr(*(int*)i);
 a=a.ToInt();
 if(a==1)
 {while(1){Form1->CSpinEdit2->Value++;Sleep(100);}}
 if(a==2)
 {while(1){Form1->CSpinEdit3->Value++;Sleep(100);}}
 if(a==3)
 {while(1){Form1->CSpinEdit4->Value++;Sleep(100);}}
}

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
 int p=0;
 while(p!=4)
   {
    CreateThread ( NULL, 0, ThreadFunc, &p, NULL, 0 );
    Sleep(1000);
    p++;
   }
}

Все это очень не красиво и работает скажем так "не стабильно".Тоесть вылетают екцепшены и все такое, но думаю код сможет хотябы пояснить что мне в результате требуется. А черт его знает...
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 09-11-2010 20:21 » 

oktonion, не все так просто, т.к. необходима синхронизация доступа к объектам. Не помню, как у них это реализуется, то как-то в доке встречал. Почитай штатную доку.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
oktonion
Участник

ru
Offline Offline

« Ответ #2 : 09-11-2010 20:37 » 

Вы про это? :
http://msdn.microsoft.com/en-us/library/ms682516%28v=VS.85%29.aspx
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-11-2010 20:39 » 

oktonion, MSDN тебе никак не поможет - у тебя BCB! Смотри в доках BCB.

Кстати, потоки там тоже по своему создаются. Конечно, никто не запрещает пользоваться Win32 API, но не надо забывать, что система в BCB все же классовая.
« Последнее редактирование: 09-11-2010 20:40 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
oktonion
Участник

ru
Offline Offline

« Ответ #4 : 09-11-2010 20:46 » 

Но поток то я создаю через CreateThread  А черт его знает...

Добавлено через 2 минуты и 49 секунд:
Да я вполне понимаю что поток может быть создан средствами билдера как File-> New->Thread Object к примеру.
Но тогда честно говоря у меня вообще нет идей как создавать нужное количество потоков в рпоцессе выполнения программы.
Можно поконкретнее где про это прочитать можно?
« Последнее редактирование: 09-11-2010 20:49 от oktonion » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 09-11-2010 21:12 » 

oktonion, еще раз: смотри документацию BCB! Или ты думаешь, что там только мышкой кликать надо?

Смотри в доке "Writing multi-threaded application".

Добавлено через 2 минуты и 7 секунд:
Цитата
Using the main VCL/CLX thread

When you use objects from the VCL or CLX object hierarchies, their properties and methods are not guaranteed to be thread-safe. That is, accessing properties or executing methods may perform some actions that use memory which is not protected from the actions of other threads. Because of this, a main thread is set aside to access VCL and CLX objects. This is the thread that handles all Windows messages received by components in your application.
If all objects access their properties and execute their methods within this single thread, you need not worry about your objects interfering with each other. To use the main thread, create a separate routine that performs the required actions. Call this separate routine from within your thread’s Synchronize method. For example:

void __fastcall TMyThread::PushTheButton(void)

{
  Button1->Click();
}
void __fastcallTMyThread::Execute()
{
  ...
  Synchronize((TThreadMethod)PushTheButton);
  ...
}


Synchronize waits for the main thread to enter the message loop and then executes the passed method.

Note:   Because Synchronize uses the message loop, it does not work in console applications. You must use other mechanisms, such as critical sections, to protect access to VCL or CLX objects in console applications.

You do not always need to use the main thread. Some objects are thread-aware. Omitting the use of the Synchronize method when you know an object’s methods are thread-safe will improve performance because you don’t need to wait for the VCL or CLX thread to enter its message loop. You do not need to use the Synchronize method for the following objects:

Data access components are thread-safe as follows: For BDE-enabled datasets, each thread must have its own database session component. The one exception to this is when you are using Microsoft Access drivers, which are built using a Microsoft library that is not thread-safe. For dbDirect, as long as the vendor client library is thread-safe, the dbDirect components will be thread-safe. ADO and InterbaseExpress components are thread-safe.

When using data access components, you must still wrap all calls that involve data-aware controls in the Synchronize method. Thus, for example, you need to synchronize calls that link a data control to a dataset by setting the DataSet property of the data source object, but you don’t need to synchronize to access the data in a field of the dataset.
For more information about using database sessions with threads in BDE-enabled applications, see Managing multiple sessions.

DataCLX objects are thread-safe although VisualCLX objects are not.
   Graphics objects are thread-safe. You do not need to use the main VCL or CLX thread to access TFont, TPen, TBrush, TBitmap, TMetafile (VCL only), TDrawing (CLX only), or TIcon. Canvas objects can be used outside the Synchronize method by locking them.

While list objects are not thread-safe, you can use a thread-safe version, TThreadList, instead of TList.

Call the CheckSynchronize routine periodically within the main thread of your application so that background threads can synchronize their execution with the main thread. The best place to call CheckSynchronize is when the application is idle (for example, from an OnIdle event handler). This ensures that it is safe to make method calls in the background thread.

Добавлено через 3 минуты и 11 секунд:
Цитата
Defining thread objects

For most applications, you can use a thread object to represent an execution thread in your application. Thread objects simplify writing multi-threaded applications by encapsulating the most commonly needed uses of threads.

Note:   Thread objects do not allow you to control the security attributes or stack size of your threads. If you need to control these, you must use the Windows API CreateThread or the BeginThread function. Even when using Windows Thread API calls or BeginThread, you can still benefit from some of the thread synchronization objects and methods described in Coordinating threads.
..........

Добавлено через 32 секунды:
Цитировать можно до утра...
« Последнее редактирование: 10-11-2010 08:36 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 10-11-2010 07:24 » 

Собствено, как уже сказал уважаемый RXL в борланде есть объект поток, от него наследуешься и реализуешь логику потока
далее для взаимодействия с GUI нужно дёргать Synchronize

В доках и примерх насколько я помню всё есть, поищи повнимательней
Ну или используй WinAPI или обёртки над WinAPI аля boost::thread
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-11-2010 08:37 » 

Для доступа к объектам VCL все равно необходимо использовать Synchronize(), ведь это GUI-объекты и обслуживает их главный поток - с ним обязательно нужно синхронизироваться.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
oktonion
Участник

ru
Offline Offline

« Ответ #8 : 10-11-2010 17:27 » 

Антон (LogRus), синхронизация нужна только для взаимодействия с GUI?
Или потоки надо всегда синхронизировать?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-11-2010 17:30 » 

oktonion, синхронизировать нужно при работе с общими данными (причем можно использовать механизмы, предлагаемые ОС). Объекты VCL всегда нужно синхронизировать - с Synchronize().
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 12-11-2010 04:40 » 

oktonion, так  как сказал RXL Улыбаюсь
GUI у тебя и есть VCL
Имхо очень удобно, что у Борланда есть такой метод
Записан

Странно всё это....
oktonion
Участник

ru
Offline Offline

« Ответ #11 : 16-11-2010 20:32 » 

Спасибо.
Создал потоки средствами билдера, все работает без ошибок.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines