![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обращение к форме внутри потока
Новичоккк © (2006-10-03 14:47:00)Я создаю поток с помощью CreateThread:
createthread(nil, 0, @MyThread, nil, 0, ht);
Вот процедура MyThread:
procedure MyThread;
begin
while true do with frmMain do
begin
if lCS.Caption<>'ACTIVE' then
begin
lCS.Caption:='ACTIVE';
//lCS.Font.Style:=[fsBold];
end;
if lCS.Font.Color=clGreen then
lCS.Font.Color:=clWindowText
else lCS.Font.Color:=clGreen;
sleep(100);
end;
end;
Почему, если убрать комментарий со строки:
lCS.Font.Style:=[fsBold];
программа при запуске зависает?
Leonid Troyanovsky (2006-10-04 13:30:00) [1]
> Новичоккк (04.10.06 09:57) [10]
> 2Джо
> Другие мастера с вами не согласны ;)
Я, например, не возразил против "вроде того"
(возможно на однопроцессорной системе).
Т.е., многое зависит от интерпретации
"поток приостановится на момент выполнения"
--
Regards, LVT.
Новичоккк (2006-10-04 10:01:00) [2]Нде. Около пяти часов искал ошибки в коде, а оказалось, что ошибкой было использование PostMessage... По крайней мере за 5 минут теста всё работает идеально.
Новичоккк (2006-10-04 09:57:00) [3]2Джо
Другие мастера с вами не согласны ;)
---
Мне необходима именно мгновенная реакция с приостановкой потока.
Значит вместо PostMessage использовать SendMessage?
clickmaker (2006-10-04 09:46:00) [4]
> При вызове PostMessage поток приостановится на момент выполнения
> TMyForm.WMMyMessage?
нет. Она сунет сообщение в очередь и отвалит.
Но для критических случаев, когда требуется немедленная реакция, это может не подойти
Leonid Troyanovsky (2006-10-04 07:06:00) [5]
> Новичоккк (03.10.06 18:23) [6]
> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?
При SendMessage - приостановится.
--
Regards, LVT.
Джо (2006-10-03 18:28:00) [6]> [6] Новичоккк (03.10.06 18:23)
> 1. Необходимо объявить константу WM_MY_MESSAGE? Если да,
> то какое значение указать?
WM_USER + произвольное значение, например 666 :)
> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?
Что-то вроде того :)
Новичоккк (2006-10-03 18:23:00) [7]2 clickmaker
Спасибо за Ваш ответ. У меня возникло два вопроса.
1. Необходимо объявить константу WM_MY_MESSAGE? Если да, то какое значение указать?
2. При вызове PostMessage поток приостановится на момент выполнения TMyForm.WMMyMessage?
clickmaker (2006-10-03 16:08:00) [8]что такое lCS - хрен его знает, но примерно так
function MyThread(Param: Pointer); Cardinal; stdcall;
begin
while not Terminated do begin
PostMessage(frmMain.Handle, WM_MY_MESSAGE, 0, 0);
sleep(100);
end;
Result := 0;
end;
type TMyForm
...
procedure WMMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
...
procedure TMyForm.WMMyMessage(var Msg: TMessage);
begin
if lCS.Caption<>'ACTIVE' then
begin
lCS.Caption:='ACTIVE';
lCS.Font.Style:=[fsBold];
end;
if lCS.Font.Color=clGreen then
lCS.Font.Color:=clWindowText
else
lCS.Font.Color:=clGreen;
end;
clickmaker (2006-10-03 16:02:00) [9]Через PostMessage, чтоб не иметь гемора с синхронизацией
Игорь Шевченко (2006-10-03 15:49:00) [10]Ketmar © (03.10.06 15:11) [2]
Если времени много, то можно.
Ketmar (2006-10-03 15:11:00) [11]>[1] Игорь Шевченко(c) 3-Oct-2006, 14:49
>Внутри потоков нельзя обращаться к формам и их
>свойствам.
можно. но очень осторожно. %-)
Игорь Шевченко (2006-10-03 14:49:00) [12]
> Я создаю поток с помощью CreateThread:
Надо создавать поток с помощью BeginThread
> Вот процедура MyThread:
> procedure MyThread;
> begin
> while true do with frmMain do
> begin
Внутри потоков нельзя обращаться к формам и их свойствам.