Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.04.2013, 04:46
katsoha katsoha вне форума
Прохожий
 
Регистрация: 01.04.2013
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Помогите пожалуйста с параллельным потоком

Доброго времени суток господа!
Имеется программа передачи данных по 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  
Старый 05.04.2013, 09:45
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

Использовать в циклах, которые могут привести к длительной нагрузке или зависаниям метод 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.
Запустите программу первый раз без изменения кода, будет подсчет в % сколько выполнено, и при нажатии на кнопку 2 цикл остановится в любой момент времени. И потом за комментируйте код так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
...
{
Application.ProcessMessages;
if FStop then break;
if Application.Terminated then break;
}
...
И получите свой эффект - кнопка "начать" зависнет пока не будет выполнен весь цикл. Где и в каких циклах в вашем проекте прилепить этот обработчик дело за вами.
Вложения
Тип файла: rar Project.rar (1.1 Кбайт, 1 просмотров)

Последний раз редактировалось orion_asm, 05.04.2013 в 09:52.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter