Вниз
Скачать: 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.013 c
1-26995
id_privin
2002-08-29 17:07
2002.09.09
как показать форму в отдельном потоке


1-27046
lexx80
2002-08-28 00:05
2002.09.09
Паморите с автозаполнением


6-27139
Alexeyk
2002-07-04 06:23
2002.09.09
Как закачать часть HTML страницы из Интернет?


3-26869
vasilly
2002-08-19 13:43
2002.09.09
Как получить на клиенте список доступных MSSQL серверов???


1-27102
Clown
2002-08-28 20:24
2002.09.09
Нужно сканировать нажатые клавиши.




   Наверх