Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача сообщений из TThread в визуальные компоненты [D6, WinXP]


Страницы:   1 2

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 компонентам должны синхронизироваться с основным потоком.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо