Форум: "Потрепаться";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.09.09;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c