Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2013, 00:18   #1
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию Пауза в потоке

Доброго времени суток всем. Ломаю голову, и понять ничего не могу.
Не работает пауза в потоке.

Создаю потоки так:

Код:
var
  TH1:TMyThread;

...


procedure TForm1.Button2Click(Sender: TObject);
begin

 Acc:=-1;
    Work:=true;
       for Thread:=1 to Form3.SpinEdit1.Value do
       begin
         TH1:=TMyThread.Create(true);
         TH1.FreeOnTerminate:=true;
         TH1.Priority:=tplower;
         TH1.Resume;
       end;

        Thread:=Form3.SpinEdit1.Value;

   end;
end;

Но пауза не работает:
Код:
TH1.Suspend;
В чём может быть проблема?
Заранее спасибо.
_ZixeL_ вне форума Ответить с цитированием
Старый 27.01.2013, 00:59   #2
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

В самом потоке выполняю код так:

Код:
procedure TMyThread.Execute;
var CurAcc, b:integer;
begin

 while Work do
  begin
   CS.Enter;
   Inc(Acc);
   if Acc<Accounts.Count then CurAcc:=Acc else Work:=false;
   CS.Leave;

   if Work then
    begin

     FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1);
     FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc]));

     <<<ТУТ КОД >>>     

     Synchronize(Sync);
    end;
  end;

 dec(Thread);

 if Thread=0 then
  begin
   ShowMessage('OK');
  end;
end;
Всё работает нормально, кроме паузы(
_ZixeL_ вне форума Ответить с цитированием
Старый 27.01.2013, 01:05   #3
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Кидаете в procedure Поток.Execute;

Код:
begin
if not Suspended then
begin
//код
FleXik вне форума Ответить с цитированием
Старый 27.01.2013, 01:06   #4
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

А на кнопку Стоп кидаете это
Код:
Поток.Suspend;
FleXik вне форума Ответить с цитированием
Старый 27.01.2013, 01:07   #5
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Всё работает нормально, кроме паузы(
Все правильно кроме того что надо использовать массив потоков
а не один экземпляр
Примерно как-то так
Код:
var
TH1:array [1..10] of TMyThread;
...
for l:=1 to 2 do begin
TH1[l]:=TMyThread.Create(true);
         TH1[l].FreeOnTerminate:=true;
         TH1[l].Priority:=tplower;
         TH1[l].Resume;
         end;
А на паузу ставить все как-то так
Код:
for l:=1 to 2 do begin
TH1[l].Suspend;
end;
Воображение важнее, чем знания. (Albert Einstein)

Последний раз редактировалось dmitriegorovih; 27.01.2013 в 01:10.
dmitriegorovih вне форума Ответить с цитированием
Старый 27.01.2013, 01:14   #6
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
Кидаете в procedure Поток.Execute;

Код:
begin
if not Suspended then
begin
//код
Не помогло.
_ZixeL_ вне форума Ответить с цитированием
Старый 27.01.2013, 01:17   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Потому что у вас потоков N а переменная TH всего одна.
Изучайте TThreadList
Человек_Борща вне форума Ответить с цитированием
Старый 27.01.2013, 01:22   #8
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от dmitriegorovih Посмотреть сообщение
Все правильно кроме того что надо использовать массив потоков
а не один экземпляр
Примерно как-то так
Код:
var
TH1:array [1..10] of TMyThread;
...
for l:=1 to 2 do begin
TH1[l]:=TMyThread.Create(true);
         TH1[l].FreeOnTerminate:=true;
         TH1[l].Priority:=tplower;
         TH1[l].Resume;
         end;
А на паузу ставить все как-то так
Код:
for l:=1 to 2 do begin
TH1[l].Suspend;
end;
А вот это помогло. Спасибо
_ZixeL_ вне форума Ответить с цитированием
Старый 27.01.2013, 01:23   #9
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Потому что у вас потоков N а переменная TH всего одна.
Изучайте TThreadList
Спасибо, буду учить.
_ZixeL_ вне форума Ответить с цитированием
Старый 27.01.2013, 16:02   #10
_ZixeL_
Форумчанин
 
Регистрация: 04.11.2012
Сообщений: 151
По умолчанию

А вот еще вопросик. Может кто поможет.

"Пауза" и "продолжить" работает нормально, до поры пока потоков не станет меньше.

Тоесть, паузу ставлю так, как советовали:

Код:
    for Thread:=1 to 50 do
     begin
      TH1[Thread].suspend;
     end;
Но, когда уже работа потоков подходит к концу, и они завершаются, то данный код не работает. Ошибка "Неверный дескриптор(6)".
Как быть в такой ситуации? Как знать кол-во работающих потоков? Спасибо.
_ZixeL_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание/изменение/удаление файлов в потоке. Мониторинг файлов в потоке. The Real Kos Общие вопросы Delphi 5 22.10.2012 23:58
Пауза при скачивании в потоке? fezilk25 Работа с сетью в Delphi 4 25.11.2011 11:48
Пауза таймера qwerty74 C# (си шарп) 3 01.07.2011 20:53
пауза в цыкле Pein95 Общие вопросы Delphi 23 12.06.2011 00:11
Рестарт и пауза? Alexxx92 Помощь студентам 5 17.05.2010 12:37