Имя: Пароль:
IT
IT-новости
Delphi: пасквилянты есть здесь? Пара вопросов
0 Коллайдер
 
16.08.09
17:52
1. Как запустить поток (thread) с передачей ему параметра (ов).
2. Как между потоками гонять поток инфы?

зы через глобальные переменные не устраивает - количество потоков м.б. переменное
1 ШтушаКутуша
 
16.08.09
17:57
(0)  вручную запаришься передавать, но!
обмен данными между потоками наз. маршаллингом данных это
стандарная "процедура" в COM.
2 v77
 
16.08.09
18:09
1. Можно перегрузить конструктор потока, добавив в него параметры. Можно добавить новые свойства к классу потока, и они будут параметры.
2. Опять свойства класса потока. Только нужно обеспечить безопасное чтение/запись переменных. Курить синхронизацию (мьютексы и т.п)
3 Torquader
 
16.08.09
18:13
Поток создаётся WinApi функцией CreateThread где передаются параметры потока, а также указатель на область данных, которые можно передать потоку при инициализации.

У всех потоков общая память - поэтому, или выделять блок памяти и передавать на него ссылку или через "стандартные тормоза COM".

Насколько я понимаю, если потоков очень много, то каждый поток получает задание, а потом отчитывается о его выполнении - тогда можно использовать даже стандартный обмен сообщениями Windows (кстати, COM обычно работает через него), только в вашем случае открывается возможность использования собственных сообщений WM_USER+1 и т.д.
4 Коллайдер
 
16.08.09
18:20
ок. пошел делать
5 Кириллка
 
16.08.09
18:37
(3)у потоков, видимо, должны быть окна, чтобы сообщения гонять?
6 Serginio1
 
16.08.09
18:41
(0) Так или иначе все сообщения передаются через очередь (оконные, потоковые, маршалинг интерфейсов, APC). Либо создай свою очередь и проверяй её в определенных местах.
7 Rie
 
16.08.09
18:43
(5) Не обязательно.
8 Кириллка
 
16.08.09
18:45
(7)а как без окон сообщениями WM_XX обмениваться?
9 romix
 
модератор
16.08.09
18:49
Через глобальные переменные м.б. понятнее но там обязательно ! надо еще юзать функции для разруливания потоков типа EnterCriticalSection/LeaveCriticalSection. Тогда они не полезут вдвоем и более в одну переменную (пример у Рихтера - два человека в одну туалетную кабинку). А вообще полезная книжка вот эта:
http://www.ozon.ru/context/detail/id/116668/
Всего не упомнишь, там как раз такие вещи. Где то есть электронное издание.
10 Torquader
 
16.08.09
18:50
Так у каждого потока есть своя очередь сообщений, которая создаётся системой при первом же запросе GetMessage, а то, что нет окон - даже хорошо - сообщения можно принимать прям в главной процедуре.
11 Кириллка
 
16.08.09
18:55
Вы мне мозг разрушаете...
Создав поток, при помощи CreateThread, вы собрались ему слать сообщения, при помощи SendMessage?
12 Кириллка
 
16.08.09
18:56
+11 в дельфи свой винапи?
13 Torquader
 
16.08.09
18:56
Вот что описано про процедуру передачи сообщения потоку:
The PostThreadMessage function places (posts) a message in the message queue of the specified thread and then returns without waiting for the thread to process the message.

BOOL PostThreadMessage(

   DWORD idThread,    // thread identifier
   UINT Msg,    // message to post
   WPARAM wParam,    // first message parameter
   LPARAM lParam    // second message parameter
  );    

SendMessage использовать нельзя, так как оно "тупо" вызывает оконную процедуру, которой у нас пока нет.
14 Torquader
 
16.08.09
18:56
Только поток получит сообщение не сразу, а как только "заглянет в очередь" - очень удобно для рассылки заданий.
15 Кириллка
 
16.08.09
19:22
(13)да тоже самое, окно должно быть:
"
Messages sent by PostThreadMessage are not associated with a window. As a general rule, messages that are not associated with a window cannot be dispatched by the DispatchMessage function. Therefore, if the recipient thread is in a modal loop (as used by MessageBox or DialogBox), the messages will be lost. To intercept thread messages while in a modal loop, use a thread-specific hook.
"
16 Кириллка
 
16.08.09
19:28
(0)Какие-то сложности на пустом месте создают с маршалингом и тп...
Используя объекты синхронизации (мьютексы, семафоры, события) делается все, что нужно.
В простом случае, выделяем память под буфер, передаем указатель на него в потоки, а при работе с этим буфером одним из потоков, выставляем мьютекс, после сбрасываем мьютекс. Таким образом никто не будет пользоваться общим буфером из разных потоков одновременно.
17 Rie
 
16.08.09
19:31
(15) Посмотри у Рихтера насчёт того, как и куда отправляются сообщения.
18 Жан Пердежон
 
17.08.09
10:50
(0) курить класс TThread
в делфе даже пример есть хороший по работе с потоками