Вниз
Скачать: 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.01 c
4-27278
wman
2002-07-08 10:33
2002.09.09
Ограничение процессорного времени


1-26950
Zelius
2002-08-29 10:42
2002.09.09
Конфликт в пакетах BPL при загрузке Delphi6


1-27089
c0pyc@t
2002-08-28 09:36
2002.09.09
Уникальный ID


3-26879
Lola
2002-08-19 17:16
2002.09.09
Выбор с помощью TQuery из базы Access


3-26916
Виталий Панасенко
2002-08-20 13:40
2002.09.09
Numeric(9 ,2) в ИБ через БДЕ




   Наверх