![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача сообщений из TThread в визуальные компоненты [D6, WinXP]
IgorP © (2005-02-26 20:28:00)Уважаемые мастера, не подскажете ли как из потока TThread правильно вывести сообщения, например в TMemo.
Сообщения простые. Типа
"Поток запустился"
"Поток протекает успешно"
"Поток закрылся"
Запускается поток процедурой CreateThread(..@"процедура"..)
Я пока ещё не мастер, и поэтому просто в "процедуре" (потоке) пишу :
Form1.Memo1.Lines.Add('...')
В результате на этой строке моё приложение виснет.
С уважением, Игорь
Набережных С. (2005-02-27 11:21:00) [21]
> atruhin © (27.02.05 11:12) [8]
Потому, что
> Запускается поток процедурой CreateThread(..@"процедура"..)
atruhin (2005-02-27 11:12:00) [22]А почему никто не сказал человеку про существование Sinhronize?
Хотя стандарные сообщения лучше конечно выводить через PostMessage, но ведь в следующем топике он спросит как вывести, резулитат :)
Набережных С. (2005-02-27 11:12:00) [23]
> sniknik © (27.02.05 10:58) [6]
Шрифт - это другое. Зависание происходит из-за блокировки канвы, а Memo.Lines.Add использует для добавления SendMessage и вся перерисовка происходит в главном потоке. Так что никаких зависаний.
sniknik (2005-02-27 10:58:00) [24]> но зависание сама по себе такая строка вряд-ли может вызвать.
может, может, если чтото приводит к перерисовке формы, помню получал такой эффект когда просто менял шрифт из потока у какогото компанента без синхронизации.
(тестил похожий вопрос с форума, еще раз ломает ;о)))
более полный исходный код ошибки конечно бы не помешал.
Набережных С. (2005-02-27 06:55:00) [25]
> IgorP
> Form1.Memo1.Lines.Add('...')
Хотя так делать не правильно, но зависаниесама по себе такая строка вряд-ли может вызвать. Что-то ты не договариваешь.
Юрий Зотов (2005-02-27 05:55:00) [26]> IgorP (26.02.05 20:28)
При создании потока передайте ему хэндл формы, которой он будет отправлять сообщения. Остальное просто, например так:
PostMessage(WndHandle, WM_USER+200, 0, 1);
Получив сообщение, форма знает, что означает число в LParam и выводит в Memo нужную строку.
Только не используйте SendMessage, иначе поток остановится и будет ждать, пока форма обработает сообщение.
GanibalLector (2005-02-27 03:55:00) [27]>Я пока ещё не мастер, и поэтому просто в "процедуре" (потоке) пишу :Form1.Memo1.Lines.Add('...')
Так нельзя.Отсылай сообщение форме.В форме обрабатывай это сообщение и заполняй Memo.
Mim2 (2005-02-27 02:57:00) [28]// Передача сообщений из TThread в визуальные компоненты
что то не клеется упрминание класса tthread в топике
с
// Запускается поток процедурой CreateThread(..@"процедура"..)
DiamondShark (2005-02-26 21:18:00) [29]Во-первых, лучше создавать потоки функцией BeginThread.
Во-вторых, и борланд этот момент упоминает в документации, обращения к VCL компонентам должны синхронизироваться с основным потоком.