![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Приветствую, господа. Вновь нужна ваша помощь.
Пишу следующий код: Код:
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 служит для выгрузки потока, если ответ от устройства получен. При посылке команды основная форма виснет и не отвечает на действия. Без потока программа работает стабильно. Буду благодарен за любой совет. Программирую недавно, пояснения в коде будут особенно полезны. |
|
#2
|
||||
|
||||
|
1. сделай процедуру и функцию по установке и получению CommBeenSent. каждую оберни в CriticalSection.Enter / CriticalSection.Leave. и избавься от этого NewThread.Destroy.
2. видно буит |