Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

WaitCommEvent   Найти похожие ветки 

 
ksa2002   (2005-02-04 08:30) [0]

Использую чтение из COM порта в отдельном потоке
установил маску ожидания .
TransMask:=0;
SetCommMask(Com,EV_RXCHAR);
WaitCommEvent(Com,TransMask,nil);

так вот при запуске потока он начинает использовать процесоор на 100 % разве  WaitCommEvent не дожно приостнавливать  до тех пор пока не произойдёт событие?


 
Digitman ©   (2005-02-04 08:41) [1]


> разве  WaitCommEvent не дожно приостнавливать  до тех пор
> пока не произойдёт событие?


должно ..

ошибка у тебя скорей всего где-то в другом месте программы. а не в точке вызова WaitCommEvent


 
ksa2002   (2005-02-04 08:45) [2]

вот код  потока
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


 
ksa2002   (2005-02-04 09:00) [3]

т.е. я хотел приостоновить процесс пока нет данных или это надо делать непосредсвтенно остновливая поток  ?


 
Digitman ©   (2005-02-04 09:04) [4]


> form1.memo1.Text:=form1.memo1.Text+s1;


кто дал тебе право обращаться к VCL-объектам в доп.потоке ?


 
ksa2002   (2005-02-04 09:12) [5]

Ладно синхронизирую я это и вытяну через глобальную переменную,
закоментировал ...поток всеравно есть все свободные ресурсы


 
Digitman ©   (2005-02-04 09:33) [6]

приведи полный код поточного класса и фрагмент кода, где ты создаешь поточный объект


 
ksa2002   (2005-02-04 09:40) [7]

ПОТОК

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 10:18) [8]

где и как объявлена переменная Com ?
как и в какой момент она инициализируется ?


 
ksa2002   (2005-02-04 10:31) [9]

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 порту.Поключение.");


Всё работает ...мне только интресно было приостоновить процесс ... пока нет данных в порте


 
Erik1 ©   (2005-02-04 10:55) [10]

Не маялся бы ты дурью, возми готовый компонент и пользуйся им. Если хочеш свой написать посмотри хотябы код VARIAN ASYNC32 v1.48 FreeWare. Ты же неиспользуеш FILE_FLAG_OVERLAPPED, тогда почнму должен работать WaitCommEvent?


 
Erik1 ©   (2005-02-04 10:59) [11]

Вот очень хорошая сылка, по com портам.
http://www.skvozilka.com.ru/delphi/components/HardWare_port.shtml


 
Digitman ©   (2005-02-04 11:03) [12]

т.е. Сom у тебя - глоб.переменная в модуле Unit1, и код [9] успешно исполняется ДО того как ты стартуешь поток ?

а зачем тебе ovr-переменная и ивент ? ты же не используешь overlapped-режим ?


> мне только интресно было приостоновить процесс


и что ? не приостанавливается ? будучи вызванной WaitCommEvent тут же возвращает управление ? и каков же результат выполнения функции (!!) WaitCommEvent ? True ? False ? если False, то о чем говорит GetLastError ?


 
ksa2002   (2005-02-04 11:03) [13]


> Ты же неиспользуеш FILE_FLAG_OVERLAPPED,
> тогда почнму должен работать WaitCommEvent?

разве ?


 
Digitman ©   (2005-02-04 11:06) [14]


> 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.


 
ksa2002   (2005-02-04 11:13) [15]

> Digitman ©   (04.02.05 11:03) [12]
Код выполняеться нормально
Но я думал что WaitCommEvent будет приостновливать поток до наступления события , чтобы тот не занемал процессор.
Ovr есть потомучто я пробывал OVERLAPPED , но тоже самое.


 
Erik1 ©   (2005-02-04 11:42) [16]

Да согласен нсчет OVERLAPPED. Просто мне кажется, что WaitCommEvent неимеет в таком режиме смысла. Постольку ReadFile прекрасно останавливает выполнение кода, а если нехочется нагружать процесор то лучше воспользоватся OVERLAPPED. Для этого надо посмотреть примеры.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
3-1108965710
xOn
2005-02-21 09:01
2005.03.20
Создание БД


1-1110123584
ser35
2005-03-06 18:39
2005.03.20
Рисунок с расширение GIF


3-1108923878
Shamansky
2005-02-20 21:24
2005.03.20
Связанные таблицы в Access


14-1109678822
asafr
2005-03-01 15:07
2005.03.20
сочинение по теме «Кем я хочу стать когда я буду большим»


4-1107344404
Serx
2005-02-02 14:40
2005.03.20
Кнопка Пуск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский