![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WaitCommEvent [D6, D7, Win2k]
ksa2002 © (2005-02-04 08:30:00)Использую чтение из COM порта в отдельном потоке
установил маску ожидания .
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);
так вот при запуске потока он начинает использовать процесоор на 100 % разве WaitCommEvent не дожно приостнавливать до тех пор пока не произойдёт событие?
Erik1 (2005-02-04 11:42:00) [1]Да согласен нсчет OVERLAPPED. Просто мне кажется, что WaitCommEvent неимеет в таком режиме смысла. Постольку ReadFile прекрасно останавливает выполнение кода, а если нехочется нагружать процесор то лучше воспользоватся OVERLAPPED. Для этого надо посмотреть примеры.
ksa2002 (2005-02-04 11:13:00) [2]> Digitman © (04.02.05 11:03) [12]
Код выполняеться нормально
Но я думал что WaitCommEvent будет приостновливать поток до наступления события , чтобы тот не занемал процессор.
Ovr есть потомучто я пробывал OVERLAPPED , но тоже самое.
Digitman (2005-02-04 11:06:00) [3]
> Erik1 © (04.02.05 10:55) [10]
> Ты же неиспользуеш FILE_FLAG_OVERLAPPED, тогда почнму должен
> работать WaitCommEvent?
тут ты не прав..
ф-ция может работать и без оверлэп-режима.
lpOverlapped
Points to an OVERLAPPED structure. This structure is required if hFile was opened with FILE_FLAG_OVERLAPPED.
это условие соблюдено.
If hFile handle was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.
Digitman (2005-02-04 11:03:00) [4]т.е. Сom у тебя - глоб.переменная в модуле Unit1, и код [9] успешно исполняется ДО того как ты стартуешь поток ?
а зачем тебе ovr-переменная и ивент ? ты же не используешь overlapped-режим ?
> мне только интресно было приостоновить процесс
и что ? не приостанавливается ? будучи вызванной WaitCommEvent тут же возвращает управление ? и каков же результат выполнения функции(!!) WaitCommEvent ? True ? False ? если False, то о чем говорит GetLastError ?
ksa2002 (2005-02-04 11:03:00) [5]
> Ты же неиспользуеш FILE_FLAG_OVERLAPPED,
> тогда почнму должен работать WaitCommEvent?
разве ?
Erik1 (2005-02-04 10:59:00) [6]Вот очень хорошая сылка, по com портам.
http://www.skvozilka.com.ru/delphi/components/HardWare_port.shtml
Erik1 (2005-02-04 10:55:00) [7]Не маялся бы ты дурью, возми готовый компонент и пользуйся им. Если хочеш свой написать посмотри хотябы код VARIAN ASYNC32 v1.48 FreeWare. Ты же неиспользуеш FILE_FLAG_OVERLAPPED, тогда почнму должен работать WaitCommEvent?
ksa2002 (2005-02-04 10:31:00) [8]com:THandle;
Com := CreateFile(Pchar(scom1),GENERIC_READ+GENERIC_write,0,nil,
OPEN_EXISTING,0,0);
ovr.hEvent:=CreateEvent(nil,FALSE,FALSE,nil);
try
Succes:=GetCommState(Com, dcb);
SetCommMask(Com,EV_RXCHAR);
dcb.BaudRate :=scom2;
dcb.ByteSize := scom3;
dcb.Parity := NOparity;
dcb.StopBits := onestopbit;
Succes:=SetCommState(Com, dcb);
GetCommTimeouts(com,timeout);
timeout.ReadIntervalTimeout:=50;
timeout.ReadTotalTimeoutMultiplier:=20;
timeout.ReadTotalTimeoutConstant:=300;
timeout.writetotalTimeoutMultiplier:=100;
timeout.writeTotalTimeoutConstant:=1000;
SetCommTimeouts(com,timeout);
purgeComm(com,purge_txclear or purge_rxclear or purge_txabort or purge_rxabort);
except
showmessage('Ошибка доступа к COM порту.Поключение.');
Всё работает ...мне только интресно было приостоновить процесс ... пока нет данных в порте
Digitman (2005-02-04 10:18:00) [9]где и как объявлена переменная Com ?
как и в какой момент она инициализируется ?
ksa2002 (2005-02-04 09:40:00) [10]ПОТОК
unit out_com_port;
interface
uses
Windows, Classes;
type
out_com_port = class(TThread)
private
protected
procedure Execute; override;
end;
implementation
uses Unit1;
procedure out_com_port.Execute;
var
e5:dword;
s1:char;
t,TransMask:dword;
begin
repeat
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);
ClearCommError(Com, e5, @ComStat);
if (ComStat.cbInQue>0) then
for t:=1 to ComStat.cbInQue do
begin
ReadFile(Com, s1,1, dwRead, nil);
end;
until Terminated
end;
end.
ВЫЗОВ ПОТОКА
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
begin
out_com_port := Tout_com_port.Create( True );
out_com_port.FreeOnTerminate := True;
out_com_port.Priority := tpLower;
out_com_port.Resume;
end
else
begin
if Assigned( out_com_port ) then out_com_port.Terminate;
end;
end;
Digitman (2005-02-04 09:33:00) [11]приведи полный код поточного класса и фрагмент кода, где ты создаешь поточный объект
ksa2002 (2005-02-04 09:12:00) [12]Ладно синхронизирую я это и вытяну через глобальную переменную,
закоментировал ...поток всеравно есть все свободные ресурсы
Digitman (2005-02-04 09:04:00) [13]
> form1.memo1.Text:=form1.memo1.Text+s1;
кто дал тебе право обращаться к VCL-объектам в доп.потоке ?
ksa2002 (2005-02-04 09:00:00) [14]т.е. я хотел приостоновить процесс пока нет данных или это надо делать непосредсвтенно остновливая поток ?
ksa2002 (2005-02-04 08:45:00) [15]вот код потока
repeat
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);
ClearCommError(Com, e5, @ComStat);
if (ComStat.cbInQue>0) then
for t:=1 to ComStat.cbInQue do
begin
ReadFile(Com, s1,1, dwRead, nil);
form1.memo1.Text:=form1.memo1.Text+s1;
end;
until Terminated
Digitman (2005-02-04 08:41:00) [16]
> разве WaitCommEvent не дожно приостнавливать до тех пор
> пока не произойдёт событие?
должно ..
ошибка у тебя скорей всего где-то в другом месте программы. а не в точке вызова WaitCommEvent