Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: CL | DM;

Вниз

А в чем недостаток Synchronize?   Найти похожие ветки 

 
Сало ©   (2007-01-24 13:55) [0]

А то на том форуме часто встречается...
Если у меня поток, ждущий что кто-то бросит сообщение (TEvent), после получения сообщения поток вызывает метод некоего класса, который ему указан, то для вызова этого метода необходим Synchronize. Что тут неверного?


 
tesseract ©   (2007-01-24 13:57) [1]

А кто сказал, что неверно? Неверно весь поток в synchronize запихивать.


 
Игорь Шевченко ©   (2007-01-24 13:58) [2]


> А то на том форуме часто встречается...

может лучше и спросить на "том" форуме ?


 
BiN ©   (2007-01-24 13:58) [3]

На форуме часто встречается обсуждение некорректного использования этой функции. И только.


 
Сергей М. ©   (2007-01-24 13:59) [4]


> сообщение (TEvent)


Сообщение - это message.
А Event - это событие.

Разницу ощущаешь ?


> для вызова этого метода необходим Synchronize. Что тут неверного?


Неверно само утверждение, что именно "необходим".

"Возможно необходим" - вот верное утверждение.


 
Ega23 ©   (2007-01-24 14:13) [5]

Неправильно вот такое:


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

type
TFirstProcess=class(TThread)
private
  { Private declarations }
protected
  procedure Work;
  procedure Execute; override;
end;
.....
procedure TFirstProcess.Execute;
begin
//while not Terminated do
 Synchronize(Work);
end;

procedure TFirstProcess.Work;
var a:DWORD;
begin
  WriteCom;
  if SetCommMask(fHandle, EV_RXCHAR) then
     WaitCommEvent(fHandle, a, nil)
  else ShowMessage("cant wait for com buffer");
   if (a=EV_RXCHAR) then
     begin
      ReadCom;
    //mm1.Lines.Add(IntToStr(z)+"  "+s);
      PurgeComm(fhandle,PURGE_RXCLEAR);
     end;
 ClosePort;
end;

procedure TForm1.btn1Click(Sender: TObject);
Begin

  if btn1.Caption = "Stop" then
   begin
     P1.Terminate;
     btn1.Caption:="Go";
     Exit;
   end;

 if btn1.Caption ="Go" then
  begin
   p1:=TFirstProcess.Create(False);
   p1.Priority:=tpLowest;
   btn1.Caption:= "Stop";
  end;
End;
....


 
Ega23 ©   (2007-01-24 14:14) [6]

Конкретно - вот это:
procedure TFirstProcess.Execute;
begin
//while not Terminated do
Synchronize(Work);
end;



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

Текущий архив: 2007.02.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.058 c
2-1170424258
Garacio
2007-02-02 16:50
2007.02.18
Текущая дата в формате dd.mm.yy


2-1170249970
Riply
2007-01-31 16:26
2007.02.18
Посылка в нить указателя на выделенную память.


15-1169692922
IMHO
2007-01-25 05:42
2007.02.18
Солженицын велик?


2-1170270359
Bagos
2007-01-31 22:05
2007.02.18
beep при OnKeyDown


1-1167054426
atruhin
2006-12-25 16:47
2007.02.18
Unit XXX implictly imported into package YYYY