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

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

ProcessMessages [D6, D7, NT4, WinXP]


Страницы:   1 2 3 4 5

dmirror ©   (2006-10-31 14:08:00) 

В чистом приложении вызов Application.processmessages работает.
Создаю поток

type
TServiceThread = class(TThread)
 public
   procedure Execute; override;
 end;
---
var
 ServiceThread: TServiceThread;

и на processmessages компилятор начинает ругаться что не видит такой функции.

что может быть и как исправить?


Игорь Шевченко   (2006-11-01 17:06:00) [41]

@!!ex ©   (01.11.06 16:58) [48]


> Собственно никто не обещает, что при проверке второй части
> условия форма все еще будет не Nil. :))


А собственно, посмотреть, при каких условиях она станет nil при проверке второго условия ?


Anatoly Podgoretsky   (2006-11-01 17:04:00) [42]

> @!!ex  (01.11.2006 16:58:48)  [48]

Это первая проблема, а вторая никто не гарантирую, что не будут вычисляться
обе части выражения, первая безопасная, а по второй имеется счастье получить
AV по полной программе. Зависит от настроек компилятора.
Помню как кто то очень громко ругался на форумах :-)


@!!ex   (2006-11-01 16:58:00) [43]


> YuRock ©   (01.11.06 16:26) [46]

Собственно никто не обещает, что при проверке второй части условия форма все еще будет не Nil. :))


Anatoly Podgoretsky   (2006-11-01 16:51:00) [44]

> YuRock  (01.11.2006 16:26:46)  [46]

Например между первой и второй перерывчик небольшой.


YuRock   (2006-11-01 16:26:00) [45]


> А ты много такого видел, откуда тогда берутся AV?


Нет, немного. Я видел только один случай, откуда берутся AV: когда обращаются к адресу памяти, доступа к которому нет.


Anatoly Podgoretsky   (2006-11-01 16:21:00) [46]

> YuRock  (01.11.2006 16:08:44)  [44]

> а голова программеру на что

А ты много такого видел, откуда тогда берутся AV?


YuRock   (2006-11-01 16:08:00) [47]


> Anatoly Podgoretsky ©   (01.11.06 15:47) [43]
> За то есть обращение
> к непринадлежащей тебе памяти. Между первой и второйперерывчик
> не большой, во время которого второй поток уже уничтожил
> объект -тут нужна критическая секция.


Блин, а голова программеру на что? Естественно, что пользоваться средствами, предоставленными Борландом, Майкрософтом и т.д. надо с умом! В этом случае, например, если используешь Application.ProcessMessages для выкрутки сообщений другого потока, надо знать, что желательно поток-то этот закрыть вообще нафиг, перед тем, как MainForm уничтожится (если она была вообще, конечно).


> Eraser ©   (01.11.06 15:24) [40]
> (MainForm.FormStyle = fsMDIForm)кстати подобных конструкций
> тоже стараюсь избегать.. в отличие от борланада ) хотя они
> если и поменяют работу компилятора - первые об этом узнают
> и перепишут код, а вот мне искать внезапно-появившиеся ошибки,
>  при переходе на новую версию компилятора, в проекте на
> несколько десятков тысяч строк не хочется.


А с этим кодом что плохого? И при чем тут компилятор?


Anatoly Podgoretsky   (2006-11-01 15:47:00) [48]

> Eraser  (01.11.2006 15:25:41)  [41]

За то есть обращение к непринадлежащей тебе памяти. Между первой и второй
перерывчик не большой, во время которого второй поток уже уничтожил объект -
тут нужна критическая секция.


Anatoly Podgoretsky   (2006-11-01 15:45:00) [49]

> Eraser  (01.11.2006 15:24:40)  [40]

Да код не безобидный даже и без потоков, легко получить не то что задумал.
Но это уже много раз разжевывалось.


Eraser   (2006-11-01 15:25:00) [50]

> [39] Anatoly Podgoretsky ©   (01.11.06 15:23)

ну записи то там нет.


Eraser   (2006-11-01 15:24:00) [51]

> [37] YuRock ©   (01.11.06 15:17)


> (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)

кстати подобных конструкций тоже стараюсь избегать.. в отличие от борланада ) хотя они если и поменяют работу компилятора - первые об этом узнают и перепишут код, а вот мне искать внезапно-появившиеся ошибки, при переходе на новую версию компилятора, в проекте на несколько десятков тысяч строк не хочется.


Anatoly Podgoretsky   (2006-11-01 15:23:00) [52]

> Eraser  (01.11.2006 15:20:38)  [38]

>  (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)

С потоками, я бы не назвал это код безобидным, легко получить как минимум AV
Это не атомарная операция.


Eraser   (2006-11-01 15:20:00) [53]

> [33] Игорь Шевченко ©   (01.11.06 10:53)

мда.. насчет AV в (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm) эт я погорячился, не учел тот факт, что форма не уничтожается, когда заканчивается Run. Но сути дела это не меняет. Я б не стал использовать методы TApplication для обработки сообщений в доп. потоке.


YuRock   (2006-11-01 15:17:00) [54]


> ощущени, что вы с потоками не работали....В курсе, что будет
> если к одной переменной одновременно обратяться из двух
> разных потоков?Семафоры и мьютексы не просто так придумали.
>


Да, знаю. В худшем случае - логические ошибки. Которые, конечно, могут повлечь за собой все, что угодно. А могут и не повлечь, как в случае с безобидным сравнение двух чисел:
 if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)


Сергей М.   (2006-11-01 13:30:00) [55]


> нужно было убить библиотеку svcmgr


А как она у тебя оказалась в проекте обычного GUI-приложения ?


dmirror   (2006-11-01 11:58:00) [56]

ProcessMessagess запускается в основной программе а не в потоке, в потоке обслуживается генераторно-осцилографическая часть. А ProcessMessagess нужен для отслеживания событий системы позиционирования, просто без него не могу получить сигнал готовности.

Код слующий

procedure TForm1.ScanStartClick(Sender: TObject);
var
 i,j : integer;
 sx,sy,vx,vy : string;
 uclen, k,h  : integer;
 temp : real;

begin
 vx := Edit16.Text;
 vy := Edit17.Text;
 sx := Edit18.Text;
 sy := Edit19.Text;
 Stringcounter :=1;
 IsFastScan:=true;
 cRecBufSizeMaxF:=trunc(cSamplPS*StrToInt(sx)/StrToInt(vx));
 cRecBufSizeMaxFBin:=(cRecBufSizeMaxF - (cRecBufSizeMaxF mod 2))*2;

 for i:=1 to StrToInt(numlines.Text) do
   begin
     sleep(200);
     isReady :=false;

     cport.WriteStr('@0A 0,5000,'+sy+','+vy+#13#10);
     start;

     j:=0;

     repeat
     inc(j);
      application.ProcessMessages();
     until IsReady;{ or (j>=15);
     if (j>=15) then begin
      ShowMessage('Каретка не дошла до конца');
     end;           }

     sleep(200);
     isReady :=false;
     Cport.WriteStr('@0A 0,5000,'+'-'+sy+','+vy+#13#10);
     repeat
       application.ProcessMessages();
     until isReady = true;

     sleep(200);
     isReady :=false;
     Cport.WriteStr('@0A'+sx+','+vx+',0,5000'+#13#10);
     repeat
      stringcounter:=Stringcounter+1;
      application.ProcessMessages();
     until isReady;

   end;

 IsFastScan:=false;
end;

А ларчик открывался достаточно просто - нужно было убить библиотеку svcmgr. После чего ProcessMessages заработал. А вот первопричина не понятна, в чистом приложении без потоков даже с  svcmgr код работал

Всем спасибо!


dmirror   (2006-11-01 11:58:00) [57]

ProcessMessagess запускается в основной программе а не в потоке, в потоке обслуживается генераторно-осцилографическая часть. А ProcessMessagess нужен для отслеживания событий системы позиционирования, просто без него не могу получить сигнал готовности.

Код слующий

procedure TForm1.ScanStartClick(Sender: TObject);
var
 i,j : integer;
 sx,sy,vx,vy : string;
 uclen, k,h  : integer;
 temp : real;

begin
 vx := Edit16.Text;
 vy := Edit17.Text;
 sx := Edit18.Text;
 sy := Edit19.Text;
 Stringcounter :=1;
 IsFastScan:=true;
 cRecBufSizeMaxF:=trunc(cSamplPS*StrToInt(sx)/StrToInt(vx));
 cRecBufSizeMaxFBin:=(cRecBufSizeMaxF - (cRecBufSizeMaxF mod 2))*2;

 for i:=1 to StrToInt(numlines.Text) do
   begin
     sleep(200);
     isReady :=false;

     cport.WriteStr('@0A 0,5000,'+sy+','+vy+#13#10);
     start;

     j:=0;

     repeat
     inc(j);
      application.ProcessMessages();
     until IsReady;{ or (j>=15);
     if (j>=15) then begin
      ShowMessage('Каретка не дошла до конца');
     end;           }

     sleep(200);
     isReady :=false;
     Cport.WriteStr('@0A 0,5000,'+'-'+sy+','+vy+#13#10);
     repeat
       application.ProcessMessages();
     until isReady = true;

     sleep(200);
     isReady :=false;
     Cport.WriteStr('@0A'+sx+','+vx+',0,5000'+#13#10);
     repeat
      stringcounter:=Stringcounter+1;
      application.ProcessMessages();
     until isReady;

   end;

 IsFastScan:=false;
end;

А ларчик открывался достаточно просто - нужно было убить библиотеку svcmgr. После чего ProcessMessages заработал. А вот первопричина не понятна, в чистом приложении без потоков даже с  svcmgr код работал

Всем спасибо!


Игорь Шевченко   (2006-11-01 10:53:00) [58]

Eraser ©   (31.10.06 19:17) [30]


>  if (MainForm <> nil) and (MainForm.FormStyle = fsMDIForm)


property FormStyle: TFormStyle read FFormStyle

property ActiveForm: TForm read FActiveForm;

И чего ?


> при завершении приложения, если доп. поток еще будет ативен,
>  в этом месте AV обязательно вылетит.


Пример не затруднит ?


Дмитрий Белькевич   (2006-11-01 02:44:00) [59]

Господа, вам в жизни проблем мало, что бы еще и на эти грабли наступать - в appllication.processmessage может случится многое - нажатия на кнопки, перерисовка итд. И коматоз обеспечен.


@!!ex   (2006-10-31 20:46:00) [60]


> YuRock

ощущени, что вы с потоками не работали....
В курсе, что будет если к одной переменной одновременно обратяться из двух разных потоков?
Семафоры и мьютексы не просто так придумали.


Страницы:   1 2 3 4 5

Наверх

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