Приветствую, господа. Вновь нужна ваша помощь.
Пишу следующий код:
Код:
type
TNewThread = class(TThread)
private
protected
procedure Execute; override;
end;
//процедура ожидания и вывода ошибки ConnectionError////////////////////////////
procedure TNewThread.Execute;
var i: integer;
begin
//CriticalSection.Enter; (раскомментирование этой строки и строки ниже не помогает)
for i:=1 to 100 do
if not CommBeenSent then NewThread.Destroy
else Sleep(1);
if CommBeenSent then begin
Application.MessageBox('ERROR. No response has been received. Please check the connection to device.', 'Ошибка!', MB_OK);
CommBeenSent := False;
end;
//CriticalSection.Leave;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CriticalSection:=TCriticalSection.Create;
......
end;
//Процедура посылки команды/////////////////////////////////////////////////////
procedure TForm1.Send(Sender: TObject);
begin
.......
if CheckBox3.Checked then begin
CommBeenSent := True;
{создание потока ожидания и вывода ошибки ConnectionError}
NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLower;
NewThread.Resume;
end;
//обработка данных, принятых по СОМ ////////////////////////////////////////////
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
begin
.......
CriticalSection.Enter;
CommBeenSent := False;
CriticalSection.Leave;
.......
end;
По сути: отправляю команды через COM-port на контроллер, на каждую получаю ответ. Если ответ не получен в течение определенного времени - выдать сообщение об ошибке подключения. Переменная CommBeenSent служит для выгрузки потока, если ответ от устройства получен.
При посылке команды основная форма виснет и не отвечает на действия. Без потока программа работает стабильно.
Буду благодарен за любой совет. Программирую недавно, пояснения в коде будут особенно полезны.