Вниз
Скачать: CL | DM;

WaitCommEvent   Найти похожие ветки 

 
Riper ©   (2002-08-14 11:44) [0]

Вопрос!Как сделать так чтобы WaitCommEvent(ComHdr, Tmp, nil)не вешал машину? Я это событие ожидаю в отдельном потоке, а к основной программе почему-то доступа нет! Виснет(уходит глубоко в себя!)! Как правельно сделать? Я понемаю ниже приведён бред? но всё таки.....плиз!
unit co;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

var
Form1: TForm1;

implementation

var
ThMy: TMyThread;

{$R *.DFM}
procedure TMyThread.Execute();
begin
{Пока процесс не прервали, выполняем DoWork}
//while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread.DoWork();
var
ComHdr:THANDLE ;
HOverlapped: TOverlapped;
Tmp :DWORD;
begin
ComHdr:=CreateFile("COM1",
GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
SetCommMask(ComHdr, EV_DSR + EV_CTS);
HOverlapped.hEvent := CreateEvent(nil, True, True, nil);
Tmp :=EV_DSR+EV_CTS;
ShowMessage("19");
{ try
while not Terminated do
begin
WaitCommEvent(ComHdr, Tmp, nil);
end
finally
ShowMessage("0");
end;}
try
while not Terminated do
begin
if WaitCommEvent(ComHdr, Tmp, nil)=false then
ShowMessage("0") else
ShowMessage("0111");;
end
finally
ShowMessage("0");
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
{c,}b,A: TLargeInteger;
arr: array [0..99] of Integer;//Single;//integer;
c,i: integer;
begin
QueryPerformanceFrequency(A);
for i:=0 to 99 do
begin
QueryPerformanceCounter(b);
arr[i]:=round(b*1000000/A);
//sleep(1);
end;
for i:=1 to 99 do
Memo1.Lines.Add(IntToStr(arr[i]-arr[i-1]));
ShowMessage("1");
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ThMy:=TMyThread.Create(False);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.ProcessMessages();
end;

end.


 
Ihor Osov'yak ©   (2002-08-14 12:03) [1]




> procedure TMyThread.Execute();
> begin
> {Пока процесс не прервали, выполняем DoWork}
> //while not Terminated do
> Synchronize(DoWork);
> end;


Ой, млин, что вас в школе учили ...

Synchronize переводит выполнение DoWork в контекст главного потока - посмотри по исходникам, может поймешь, обьяснять здесь долго. Так что поверь на слово ...

Соотв. WaitCommEvent, вызываемый из контекста основного потока остановит основной поток. Со всеми последстиями, которые ты лицезреешь ...

ЗЫ. Много хороших дел сделал борланд, но вот за их синхронайз .... Очень хорошо ребята прикололись ...





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

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.009 c
14-27224
lds78
2002-08-09 10:59
2002.09.09
ZIP/UNZIP без VCL


1-27065
dim-
2002-08-28 01:44
2002.09.09
Помогите заполнить дерево из меню


3-26871
ACampball
2002-08-19 11:30
2002.09.09
Выбор БД


1-26949
Den2
2002-08-28 21:01
2002.09.09
Как заставить работать DDE в потоке (т.е. независимом процессе)


1-27021
and00
2002-08-23 10:37
2002.09.09
надеюсь несложный вопрос




   Наверх