![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Посылка строки из TThread в основной поток [D7, XP]
дед Маздай © (2008-11-13 11:30:00)Каким образом реализовать сабж? Имеется в виду посылка через SendMessage.
И как реализовать механизм при котором несколько потоков не портили бы посылаемую строку?
дед Маздай (2008-11-13 14:48:00) [21]Хотя, если я правильно понимаю, при SendMessage строа не сможет затереться, ведь пока не будет обработано сообщение мы в поток не вернемся, точнее не продолжится работа потока.
На самом деле, это не реальная задача. Я просто изучаю работу с потоками. С синхронизацией через Sinchronize разобрался. Теперь вот через посылку сообщений делал, но видимо задачу не правильно подобрал, т.к эта, конечно же, решается проще именно через Sinchronize.
Есть ли где-нибудь, типа задачника что-то, про потоки, что бы порешать?
Но с очередью всеравно сделаю ;)
дед Маздай (2008-11-13 14:31:00) [22]Ага, спасибо. Реализую тогда в таком виде.
Ega23 (2008-11-13 14:11:00) [23]
> То есть, надо создать обычный StringList и два потокозащищенных
> метода - AddString и RemoveString.
тогда уж PushString и PopString, как это в FIFO принято...
Юрий Зотов (2008-11-13 14:03:00) [24]> дед Маздай (13.11.08 11:30)
> как реализовать механизм при котором несколько потоков не портили бы
> посылаемую строку?
Потокозащищенный список строк (очередь). Пришедшая строка добавляется в конец списка, а на обработку извлекается первая строка в списке (и после обработки из списка удаляется).
Тогда и сообщений никаких не надо - каждый поток просто добавляет свою строку в список, а главный (или какой-то еще) поток извлекает их оттуда, обрабатывает и удаляет. Кстати, и строки гарантированно не будут умирать раньше, чем будут обработаны.
То есть, надо создать обычный StringList и два потокозащищенных метода - AddString и RemoveString.
Ega23 (2008-11-13 13:48:00) [25]
> с постом стремно. строка на момент обработки сообщения может
> быть уже мертва
Если она не локальная переменная, то с фига-ли?
Хотя надо смотреть, как реаллок работает...
дед Маздай (2008-11-13 13:38:00) [26]Да? Действительно? Я думал об этом, ведь не случано же появилась вторая часть вопроса в [0]
Поросенок Винни-Пух (2008-11-13 13:05:00) [27]с постом стремно. строка на момент обработки сообщения может быть уже мертва
дед Маздай (2008-11-13 12:47:00) [28]Юрий Зотов © (13.11.08 12:24) [7]
Спасибо, Юрий за расжевывание.
Юрий Зотов (2008-11-13 12:24:00) [29]> дед Маздай (13.11.08 11:59) [5]
1. Можно и проще - Integer(SomeStr). В Delphi переменная типа String - это по сути указатель и его значение можно передавать, как целое число.
2. Если тормозить поток не надо, используйте PostMesage.
дед Маздай (2008-11-13 12:05:00) [30]Сергей М. © (13.11.08 11:54) [4]
Нет, не обязательно. Да я, собственно, нигде этого и не утвеждал. ;)
дед Маздай (2008-11-13 11:59:00) [31]Поросенок Винни-Пух © (13.11.08 11:37) [2]
Да, действительно раборает. А я все пытался указатель передать, типа integer(@somestr) ну и конечно это не работало.
Сергей М. (2008-11-13 11:54:00) [32]
> дед Маздай (13.11.08 11:50) [3]
А "тормозить" работу доп.потока при этом обязательно ?
Ведь SendMessage - функция, предполагающая синхронное блокирующее исполнение, в отличие от, например, PostMessage ..
дед Маздай (2008-11-13 11:50:00) [33]Сергей М. © (13.11.08 11:36) [1]
Предполагается выводить ее как информацию о работе потока. Например, "Значение 1: 1 - Значение 2: 2 - Значение 3: 3" и т.п.
Поросенок Винни-Пух (2008-11-13 11:37:00) [34]SenMessage(handle,my_message,WParam(PChar(string)),0)
Сергей М. (2008-11-13 11:36:00) [35]
> дед Маздай (13.11.08 11:30)
А что предполагается делать с переданной строкой в осн.потоке, после того как он ее получит ?