Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Вниз

TThread + TTimer   Найти похожие ветки 

 
Digitman   (2004-01-15 12:40) [40]


> Dred2k © (15.01.04 12:29) [34]
> > Digitman © (15.01.04 12:22) [28]
>
> Не факт. Может и не получить.


"в любом случае" - здесь имелось ввиду не гарантия доставки сообщения, а то что именно кодовый поток ответственен за выборку сообщений изо всех его интересующих (и ассоциированных с ним и его окнами) очередей


> The function fails if the specified thread does not have
> a message queue. The system creates a thread"s message queue
> when the thread makes its first call to one of the Win32
> USER or GDI functions.


а это уже проблема того программера, который не удосужился предусмотреть такую ситуацию и тычет сообщение в еще не созданную очередь. не проверяя никак факт успешной или неуспешной постановки сообщения в очередь

поэтому одним из грамотных подходов к реализации корректной логики является следующий :

поток-отправитель :
while not PostThreadMessage() do ..

поток-получатель же должен сразу после старта как можно быстрее вызвать любую из ф-ций, отвечающих за выборку сообщений из очереди (при первом же вызове очередь будет создана), например :

PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE)


 
snake1977   (2004-01-15 12:44) [41]

>>Digitman ©
объясняю почему не Timer который запускает Thread. Программа посотренна таким образм: есть главный модуль который запускает процедуры из прописанных в его настройках DLL модулях. Каждая из запускаемых процедур отвечает только за свою фунукцию, например одна прослушивает сокет и получая сообщение записывает его в файл, другая просмотривает диск на наличие файлов определнного вида, найдя открывает и обрабатывает выкладывая результат в другой файл. третья просмотривает файлы ответов и отправляет его через сокет :) вот примерно так. Количество таких модулей заранее не известно и период срабатывания каждой из процедур также может быть различен. при всем при этом естесвтенно что модуль овечающий за например прослушивание сокета не как не связан и не джолжен мешать работе модуля обрабатывающего файлы. вот по тому и надо сделать паралельное функционирование различных модулей , которые обрабатывают информацию в различные периоды времени


 
Dred2k   (2004-01-15 12:52) [42]

> Digitman © (15.01.04 12:40) [40]

> поток ответственен за выборку сообщений

> здесь имелось ввиду
"в любом случае" - оставляет не слишком много вариантов. Теперь понятно.

> поэтому одним из грамотных подходов к реализации корректной
логики является следующий ...


Я бы сказал, что это не "грамотный подход", а однозначно документированные требования.


 
Nikolay M.   (2004-01-15 12:53) [43]


> snake1977 (15.01.04 12:44) [41]

Не влезая в суть разбирательств, обращаю внимание на [36] и рекомендую еще посмотреть TRxTimerList. Хотя это дело хозяйское.


 
Verg   (2004-01-15 12:54) [44]


> snake1977 (15.01.04 12:44) [41]


Все понятно, непонятно для чего в этих потоках тебе TTimer, т.е. этот компонент именно?
Для отсчета таймаутов и безо всяких TTimer хватает средств.


 
Digitman   (2004-01-15 12:55) [45]


> snake1977 (15.01.04 12:44) [41]


кинь на форму один-единственный TTimer, установи нужный период срабатывания

в обработчике OnTimer() создавай один или более объектов-наследников TThread, метод Execute каждого из которых будет заниматься своим делом и никак не будет мешать иным потокам

осн.потоку остается только при каждом тике таймера проверять состояние завершенности тех или иных потоков, чтобы не создавать лишние


 
Digitman   (2004-01-15 12:57) [46]


> Dred2k © (15.01.04 12:52) [42]
> Я бы сказал, что это не "грамотный подход", а однозначно
> документированные требования.


поэтому, очевидно, и грамотный.
непонятно только зачем ты цитировал хэлп - мне это известно не хуже тебя


 
Dred2k   (2004-01-15 13:00) [47]

По-моему, тут проще можно. Передаем в нитку при создании отправное значение GetTickCount (для синхронизации) и расписание срабатываний. Далее поток просто считает тики и сверяет с расписанием, когда нужно - срабатывает.


 
Verg   (2004-01-15 13:03) [48]


> Digitman © (15.01.04 12:55) [45]
>
> > snake1977 (15.01.04 12:44) [41]
>
>
> кинь на форму один-единственный TTimer, установи нужный
> период срабатывания
>
> в обработчике OnTimer() создавай один или более объектов-наследников
> TThread, метод Execute каждого из которых будет заниматься
> своим делом и никак не будет мешать иным потокам


А что, без таймера никак нельзя запустить несколько кодовых потоков, каждый из которых вызовет нужную свою ф-цию из DLL?


 
Dred2k   (2004-01-15 13:06) [49]

> Digitman © (15.01.04 12:57) [46]

> непонятно только зачем ты цитировал хэлп - мне это известно
не хуже тебя

Это хорошо. Молодец.

P.S.
А действительно - с какого такого перепоя я вдруг без высочайшего разрешения позволил себе процитировать ВАМ (простиТЕ, большЕЕ буковок нет) хелп.
Непозволительная грубость. Исключительный цинизмъ.

P.P.S.
Все хорошо в меру. В том числе и жажда научить.


 
Digitman   (2004-01-15 13:08) [50]


> Verg © (15.01.04 13:03) [48]


а я почем знаю ? я именно так понял задачу автора из его слишком общих и не совсем терминологически корректных объяснений

все зависит от

> которые обрабатывают информацию в различные периоды времени


что за периоды, как они связаны с центральной логикой управления потоками - мне не понятно на сей момент из вышеизложенного


 
Verg   (2004-01-15 13:09) [51]


> Далее поток просто считает тики и сверяет с расписанием,
> когда нужно - срабатывает.


Я че-то не пойму - где в ТЗ (snake1977 (15.01.04 12:44) [41] ) :) упоминание о каких-либо "расписаниях" ?

Там явно написано, что потоки должны быть независимы и выполняться одновремено


 
Digitman   (2004-01-15 13:09) [52]


> Dred2k © (15.01.04 13:06) [49]


без комментариев


 
Verg   (2004-01-15 13:16) [53]


> обрабатывают информацию в различные периоды времени


По-моему, это "переводится", как "Обрабатывают информацию за различное время"
Т.е. одна ф-ция может управится со своей работой за 1 сек, а другой и 5-ти минут может не хватить.


 
Digitman   (2004-01-15 13:20) [54]


> Verg © (15.01.04 13:16) [53]


нет, мне здесь иное не понятно - то ли планирование запуска должно быть реализовано с учетом некоего центрального расписания (которое вполне могло быть у автора реализовано и в осн.потоке), то ли осн.поток сразу стартует N доп.потоков и за сим успокаивается (потоки же после старта сами реализуют индивидуальные расписания), то ли и сами потоки запускаются по расписанию и затем реализуют внутри себя еще и собственные расписания ...


 
y-soft   (2004-01-15 13:22) [55]

А почему обязательно Timer? Штука это низкоприоритетная и не слишком точная. Sleep надежен, но тоже неточен.

Хорошее и простое решение получается с WaitableTimer, причем можно вынести его обработку в отдельный поток с тем, чтобы он периодически будил остальные потоки...


 
Dred2k   (2004-01-15 13:34) [56]

> Verg © (15.01.04 13:09) [51]

> snake1977 (15.01.04 12:44) [41]
которые обрабатывают информацию в различные периоды времени


то ли имеется в виду параллельность работы, то ли некие конкретные периоды между выполнением прикладных дейтсвий. Надеюсь, будут пояснения.


 
Digitman   (2004-01-15 13:41) [57]

если требуется некая универсальность, дабы не плодить кучу классов-наследников TThread, можно реализовать единственного наследника, в теле Execute которого запустить цикл выборки/диспетчеризации сообщений :

while not Terminated and GetMessage(Msg, 0, 0 0) do
if Msg.hWnd = 0 then
Dispatch(Msg.message) //обработка сообщений данному потоку
else
DispatchMessage(Msg); //обработка сообщений окнам, потенциально создаваемым в контексте данного потока

теперь некий поток-координатор (пусть это будет осн.поток) в соответствии с событиями некоего расписания запуска неких п/программ (неважно где находящихся, лишь бы в тек. ВАП их тела были) посылает сообщение первому же найденному потоку, свободному от обработки предыд.сообщений, сообщение с параметрами, указывающими на адрес п/программы, которую следует запустить в контексте найденного потока, и параметрами, которые следует передать этой п/программе при ее вызове


 
gaa   (2004-01-15 17:06) [58]

constructor TWaitableTimer.Create(Name: PAnsiChar = nil);
begin
FTimerHandle:= CreateWaitableTimer(nil,True,Name);
FEnabled:= False;
FDueTime:= WT_MSec;
FResume:= False;
FPeriod:= wtpPeriod;
FTimerContext:= nil;
FName:= Name;
// OpenWaitableTimer($1F0003,False,Name)
end;



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.01 c
14-93685
kaif
2004-01-05 02:01
2004.01.29
---|Ветка была без названия|---


7-93721
Евген
2003-11-07 14:23
2004.01.29
Кто работал с мини-АТС КХ-ТА308


1-93558
Lony
2004-01-17 14:00
2004.01.29
Папку в Exe


3-93406
NailMan
2004-01-05 09:33
2004.01.29
База для Media Library видеоплеера


1-93512
ИМХО
2004-01-18 20:41
2004.01.29
Функция, возвращающая массив значений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский