Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Как выводить статус от нескольких потоков?   Найти похожие ветки 

 
GrayFace ©   (2006-03-06 14:57) [40]

Leonid Troyanovsky ©   (03.03.06 13:15) [24]
Т.е., налицо все, что требуется от синхронизации.
Кстати, в ранних версиях дельфи она так и реализовывалась.

Не только в ранних. В Delphi 7 это тоже так.

MegaVolt
Обновлять статистику, по-моему, лучше всего методом [9]+[22]. В [22] написана ерунда про SendMessage, но алгоритм с Post описан верно и должен дать наилучший результат.

Leonid Troyanovsky ©   (03.03.06 13:43) [26]
Зачем в цикле? Запустил поток - inc, закончился поток - dec.
Т.е., если значение больше допустимого - не запускаем.

Точнее, запуск - InterlockedIncrement, завершение - InterlockedDecrement и PostMessage гл. потоку. Главный поток вначале запускает потоков до предела, потом запукает потоки при получении сообщений.

Запись в файл - точно так же - PostMessage и запись в главном или записывающем потоке. Но не WM_COPYDATA, а свое сообщение с указателем и размером в параметрах. Записывающий поток после записи будет освобождать память.


 
Leonid Troyanovsky ©   (2006-03-06 15:12) [41]


> GrayFace ©   (06.03.06 14:57) [40]

> Не только в ранних. В Delphi 7 это тоже так.


Не совсем.
Начиная с D5 - очередь где-то в районе Application.Idle.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-03-06 15:18) [42]


> GrayFace ©   (06.03.06 14:57) [40]


> Точнее, запуск - InterlockedIncrement, завершение - InterlockedDecrement
> и PostMessage гл. потоку. Главный поток вначале запускает
> потоков до предела, потом запукает потоки при получении
> сообщений.

ILI, IDI не обязательны. Конструктор и OnTerminate
выполняются в первичном потоке.

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

Почему "но"? Хочется асинхронности - Post.
Для синхронности SendMessage, а WM_COPYDATA - сгодится
для любых потоков, даже из других процессов.

--
Regards, LVT.


 
MegaVolt ©   (2006-03-06 15:39) [43]

>И просматривать 100Мб в блокноте. Ню-ню.

Зачем это? Специально заточенная прога просматривает этот файлик практически мгновенно :)

Из всего рассуждения я понял что и Post и Send подходят только один притормаживает поток а второй нет и возможна ситуация когда придёт сообщение от мёртвого потока. Но оба метода потокобезопасны?


 
isasa ©   (2006-03-06 16:04) [44]

С WM_COPYDATA Post не получится, только Send.


 
GrayFace ©   (2006-03-06 16:30) [45]

Я имелл ввиду метод из [20], а не [22]


 
isasa ©   (2006-03-06 16:40) [46]

Хотя MSDN стало не таким категоричным

MSDN January 2000

WM_COPYDATA
An application sends the WM_COPYDATA message to pass data to another application.

To send this message, call the SendMessage function with the following parameters (do not call the PostMessage function).

MSDN January 2006

WM_COPYDATA Message

--------------------------------------------------------------------------------

An application sends the WM_COPYDATA message to pass data to another application.

Syntax

To send this message, call the SendMessage function as follows.



 
Leonid Troyanovsky ©   (2006-03-06 16:42) [47]


> MegaVolt ©   (06.03.06 15:39) [43]

> оба метода потокобезопасны?


Рефрен: PostMessage (with GetMem & FreeMem in the work thread) -
асинхронная обработка.
SendMessage - синхронная обработка, с возможностью выполнения
любого кода в обработчике сообщения.

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-03-06 16:49) [48]


> isasa ©   (06.03.06 16:04) [44]
> С WM_COPYDATA Post не получится, только Send.


Влом проверять, но PostMessage with WM_COPYDATA, посылаемое
внутри процесса не должно принципиально отличаться от любого,
скажем, WM_USER. Т.е., посылаемые указатели будут всегда
действительны, однако гарантий того, что данные по этому
указателю не будут освобождены посылающим до окончания
обработки никто не даст.

--
Regards, LVT.


 
GrayFace ©   (2006-03-06 16:59) [49]

Я уж отвык от скорости обсужнения, сравнимой с чатом.

Leonid Troyanovsky ©   (06.03.06 15:18) [42]
ILI, IDI не обязательны. Конструктор и OnTerminate
выполняются в первичном потоке.

Да, о них я не подумал. OnTerminate будет хорошо, проще. Единственное но - если может выполниться раньше, чем прийдет сообщение сообщение об обновлении статуса. Хотя, тоже не проблема - вызвать вначале Application.ProcessMessages и все.

В общем, PostMessage будет побыстрее и особых проблем, я думаю, не вызовет - PocessMessages в OnTerminate должен их ликвидировать.



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

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.013 c
2-1143365039
Golik
2006-03-26 13:23
2006.04.09
Как добавить запись ?


15-1142803604
Volf_555
2006-03-20 00:26
2006.04.09
Проблема с DVD - читает только CD-диски, а DVD-нет...


4-1137434926
Mysterious
2006-01-16 21:08
2006.04.09
Анимационный персонаж


2-1143103822
dabreezy
2006-03-23 11:50
2006.04.09
Вопрос по потокам.


3-1139663245
Chel
2006-02-11 16:07
2006.04.09
Работа с TDBGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский