|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите пожалуйста с параллельным потоком
Доброго времени суток господа!
Имеется программа передачи данных по LPT порту для Win XP. Все работает, данные передаются, но проблема в том что когда клиент не отвечает программа переходит в режим ожидания клиента (в данном случае бесконечный цикл). Необходимо сделать так, чтобы программа останавливалась и выходила по кнопке "Выход". Если программа в бесконечном цикле, то на кнопку она не реагирует. Проект если что скину. Заранее благодарен !!! Код:
procedure TForm1.Button2Click(Sender: TObject); begin memo2.clear; ProgressBar1.position:=0; Label6.Caption:=inttostr(0); Label4.Caption:=inttostr(0); { for i:=1 to 100000 do symv[i]:='';} AssignFile(f,paramStr(1)); reset(F); i:=0; flag:=true; while not EOF(F) and flag=true do begin read(f,ch); // Memo1.Text:=memo1.Text+c; if ch<>#10 then begin if ((symv[i-3]<>'M') or (symv[i-2]<>'0') or (symv[i-1]<> '2')) then begin symv[i]:=ch; inc(i); end else begin flag:=false;{----------------------------------------------------------} symv[i]:=#13; inc(i); end; end; end; p:=i; ProgressBar1.max:=p; Label6.Caption:=inttostr(round(i/1000)); for i:=0 to p-1 do//while not EOF(F) do begin repeat if not(d) then Label2.Font.Color:=clred; Label2.Caption:= 'Ожидание готовности станка'; Application.ProcessMessages(); d:=pin10; // delayUS(300); Until (d); ProgressBar1.position:=i; Label4.caption:=inttostr(round(i/p*100)); if symv[i]<>#13 then Begin {***************************** Отправка данных ********************************} MAD: Тег code а не quote Последний раз редактировалось M.A.D.M.A.N., 05.04.2013 в 09:49. |
#2
|
||||
|
||||
Использовать в циклах, которые могут привести к длительной нагрузке или зависаниям метод ProcessMessages объекта Application. Вот пример демонстрации вашей ситуации и ее устранение:
Код:
var Form1: TForm1; FStop : boolean; // Глобальная переменная implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i : integer; st: string[7]; begin FStop := false; // Создаем цикл из 100000 итераций: for i := 0 to 100000 do begin str((i / 1000) : 6 : 4, st); Label1.Caption := 'Выполнено: '+ st +'%'; // Обработчик зависания на время вычисления цикла Application.ProcessMessages; if FStop then break; if Application.Terminated then break; end; end; procedure TForm1.Button2Click(Sender: TObject); begin FStop := true; end; end. Код:
procedure TForm1.Button1Click(Sender: TObject); ... { Application.ProcessMessages; if FStop then break; if Application.Terminated then break; } ... Последний раз редактировалось orion_asm, 05.04.2013 в 09:52. |