Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.09;
Скачать: 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 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.016 c
1-27014
Jonny
2002-08-27 15:28
2002.09.09
Передача управления на форму


4-27255
Maksim
2002-07-06 12:28
2002.09.09
Универсальный Thread !!!


14-27223
npAKtuk
2002-08-14 14:02
2002.09.09
Как поставить компонент Delphi5 на Delphi6?


4-27283
Storonnik
2002-07-19 18:33
2002.09.09
Как послать приложению нажатие какой-нибудь клавиши?


14-27201
V.exeR
2002-08-14 21:41
2002.09.09
Бета-тестинг