![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |