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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2013, 04:57   #1
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
Сообщение Проблема с заморзкой потоков [Delphi 7]

Всем здравствуйте, не могу понять, почему при нажатии на кнопку пауза (заморозка потоков) иногда виснет программа. Программа делает запросы на сервер, использую Indy и работает в 100 - 250 потоков. Потоки создаю динамически через класс TThread и держу их в массиве. Подскажите пожалуйста в чем может быть причина зависания и как это исправить.
Заранее спасибо.

вот код кнопки пауза:

Код:
var
  i: Integer;
begin
  if btn5.Caption='Пауза' then
    begin
      for i:=0 to Length(CtThreads) do
        begin
          try
          CtThreads[i].Suspend;
          except
          end;
        end;

    btn3.Enabled:=False;
    btn5.Caption:='Возобновить';
    end

  else
  begin
    for i:=0 to Length(CtThreads) do
      begin
        try
        CtThreads[i].Resume;
        except
        end;
      end;

  btn3.Enabled:=True;
  btn5.Caption:='Пауза';
  end;

end;
Lifeda92 вне форума Ответить с цитированием
Старый 23.10.2013, 09:02   #2
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

бить за такое
Код:
except
end;
ты в этом уверен?
for i:=0 to Length(CtThreads) ???-1???do
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 23.10.2013, 11:05   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Наверно try except это следствие второй ошибки с длиной массива
Автор не понял ее, испугался, и стал глотать исключения.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2013, 17:21   #4
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
Сообщение

Спасибо за отклик, ну хорошо, а что тогда здесь не так.


Вот как я создаю потоки:

Код:
n:=0;
SetLength(CtThreads, edt2.Value);
          
        for Thread:=0 to edt2.Value-1 do
            begin
            CtThreads[Thread]:=Potok.Create(True);
            CtThreads[Thread].FreeOnTerminate:=True;
            CtThreads[Thread].Priority:=tpNormal;
            CtThreads[Thread].Resume;
            Inc(n);
            end;

m:=edt2.Value-1;
И вот код паузы.
Не могу понять... Иногда жму кнопку по 10 раз и все норм, ничего не виснет,
а иногда нажму и виснет вся программа... Подскажите что мне нужно сделать чтобы не было зависания. Спасибо.

Код:
  if btn5.Caption='Пауза' then
    begin
      for i:=0 to n-1 do
        begin
        CtThreads[i].Suspend;
        end;

    btn3.Enabled:=False;
    btn5.Caption:='Возобновить';
    end

  else
  begin
    for i:=0 to n-1 do
      begin
      CtThreads[i].Resume;
      end;

  btn3.Enabled:=True;
  btn5.Caption:='Пауза';
  end;
Lifeda92 вне форума Ответить с цитированием
Старый 23.10.2013, 17:43   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я бы попробовал какой-то другой способ паузы.
Никогда не использовал нигде Suspend и в документации пишут, что
Цитата:
Сообщение от http://docwiki.embarcadero.com/Libraries/XE3/en/System.Classes.TThread.Suspend
Warning: Suspend method should only be used for debugging purposes. Suspending a thread using Suspend can lead to deadlocks and undefined behavior within your application.
Что собственно у вас и есть.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2013, 18:47   #6
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
Сообщение

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я бы попробовал какой-то другой способ паузы.
Никогда не использовал нигде Suspend и в документации пишут, что

Что собственно у вас и есть.
Я даже не знаю как еще можно остановить эти потоки
Можете пожалуйста подсказать способ) Если не трудно.
Или может ссылку на статью, там где рассказывают как правильно морозить потоки.
Спасибо.

Последний раз редактировалось Lifeda92; 23.10.2013 в 18:50.
Lifeda92 вне форума Ответить с цитированием
Старый 23.10.2013, 18:52   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Смотря что вы там делаете. Может лучше убивать и пересоздавать (остановить/запустить, паузу убрать).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.10.2013, 18:57   #8
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

У меня есть кнопка стоп, но я не хотел бы убирать паузу(
Lifeda92 вне форума Ответить с цитированием
Старый 23.10.2013, 18:58   #9
Lifeda92
Пользователь
 
Регистрация: 15.08.2012
Сообщений: 39
По умолчанию

В потоках, я шлю запросы на сервер и обрабатываю ответы от сервера.
Lifeda92 вне форума Ответить с цитированием
Старый 23.10.2013, 19:02   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В потоке что именно делаете? Код бы посмотреть.

Можно добавить свойство типа IsPaused: boolean (и наверно стоит сделать работу с ним TCriticalSection), при паузе ставить его в True и в потоках переодически проверять и делать что-то типа
Код:
while IsPaused do
  Sleep(50);
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать программу многопоточной (достаточно двух потоков). Delphi user_12 Помощь студентам 0 27.12.2011 20:40
Проблема синхронизации потоков Teor Общие вопросы .NET 4 17.06.2011 15:50
Поисковик по маске. Использование потоков в среде(tthread) Delphi. lnikon Общие вопросы Delphi 1 22.07.2010 19:31
Реализация двух потоков, работа с буфером, механизм семафоров (С++ или Delphi) shoonya Помощь студентам 0 05.04.2010 14:08
delphi теория потоков tanek Помощь студентам 0 19.03.2010 19:40