Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

Обращение к форме внутри потока   Найти похожие ветки 

 
Новичоккк   (2006-10-03 14:47) [0]

Я создаю поток с помощью 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];
программа при запуске зависает?


 
Игорь Шевченко ©   (2006-10-03 14:49) [1]


> Я создаю поток с помощью CreateThread:


Надо создавать поток с помощью BeginThread


> Вот процедура MyThread:
> procedure MyThread;
> begin
> while true do with frmMain do
>  begin


Внутри потоков нельзя обращаться к формам и их свойствам.


 
Ketmar ©   (2006-10-03 15:11) [2]

>[1] Игорь Шевченко(c) 3-Oct-2006, 14:49
>Внутри потоков нельзя обращаться к формам и их
>свойствам.
можно. но очень осторожно. %-)


 
Игорь Шевченко ©   (2006-10-03 15:49) [3]

Ketmar ©   (03.10.06 15:11) [2]

Если времени много, то можно.


 
clickmaker ©   (2006-10-03 16:02) [4]

Через PostMessage, чтоб не иметь гемора с синхронизацией


 
clickmaker ©   (2006-10-03 16:08) [5]

что такое 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;


 
Новичоккк   (2006-10-03 18:23) [6]

2 clickmaker
Спасибо за Ваш ответ. У меня возникло два вопроса.
1. Необходимо объявить константу WM_MY_MESSAGE? Если да, то какое значение указать?

2. При вызове PostMessage поток приостановится на момент выполнения TMyForm.WMMyMessage?


 
Джо ©   (2006-10-03 18:28) [7]

> [6] Новичоккк   (03.10.06 18:23)
> 1. Необходимо объявить константу WM_MY_MESSAGE? Если да,
> то какое значение указать?

WM_USER + произвольное значение, например 666 :)


> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?

Что-то вроде того :)


 
Leonid Troyanovsky ©   (2006-10-04 07:06) [8]


> Новичоккк   (03.10.06 18:23) [6]

> 2. При вызове PostMessage поток приостановится на момент
> выполнения TMyForm.WMMyMessage?


При SendMessage - приостановится.

--
Regards, LVT.


 
clickmaker ©   (2006-10-04 09:46) [9]


> При вызове PostMessage поток приостановится на момент выполнения
> TMyForm.WMMyMessage?

нет. Она сунет сообщение в очередь и отвалит.
Но для критических случаев, когда требуется немедленная реакция, это может не подойти


 
Новичоккк   (2006-10-04 09:57) [10]

2Джо
Другие мастера с вами не согласны ;)
---
Мне необходима именно мгновенная реакция с приостановкой потока.
Значит вместо PostMessage использовать SendMessage?


 
Новичоккк   (2006-10-04 10:01) [11]

Нде. Около пяти часов искал ошибки в коде, а оказалось, что ошибкой было использование PostMessage... По крайней мере за 5 минут теста всё работает идеально.


 
Leonid Troyanovsky ©   (2006-10-04 13:30) [12]


> Новичоккк   (04.10.06 09:57) [10]
> 2Джо
> Другие мастера с вами не согласны ;)


Я, например, не возразил против "вроде того"
(возможно на однопроцессорной системе).

Т.е., многое зависит от интерпретации
"поток приостановится на момент выполнения"

--
Regards, LVT.



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

Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.038 c
15-1159842127
Slider007
2006-10-03 06:22
2006.10.22
С днем рождения ! 3 октября


4-1149356336
oleg_SYS
2006-06-03 21:38
2006.10.22
Нажатие кнопки в чужом приложении


2-1159944460
parasolka
2006-10-04 10:47
2006.10.22
Где ошибка?


15-1159459101
Nic
2006-09-28 19:58
2006.10.22
Теперь и я не безработный


3-1156155450
tytus
2006-08-21 14:17
2006.10.22
Первичнй ключ по двум столбцам?





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