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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2015, 14:32   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию Приостановка потока с последующем возобновлением работы

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

Суть в том что есть два потока один на чтение данных пришедших по сети, второй на отправку. Не хочу гонять постояно поток на отправку если нет данных для отправки. Хочу приостанавливать работу потока до тех пор пока не поступят какието аднные на отправку.

Почитал в инете кто-то говорит что можно использовать Suspend потом Resume. Кто-то наоборот отговаривает от этого!
С потоками мало знаком!
Мб проще будет делать Terminate и потом оп необходимости создавать новый поток?

Что скажите?
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 14:34   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы предпочел не выключать поток. В потоке просто бы проверял на доступность данных для отправки, и если доступны в полной (читай: допустимой для твоей задачи) мере - отправлял бы. Иначе sleep() и на следующую итерации цикла проверки, пока not Terminated.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.04.2015, 14:52   #3
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Ну то что он будет гонять цикл на not Terminated мне не нравиться, понятно что проверка идёт есть даные на отправку или нет! Хочу чтобы если данных нет он просто засыпал

Код:
  TCustomThreadSenderTCP = class(TThread)
  private
    FSendList: TSendList;
    FSocket: TSocket;
    FMutex: Boolean;
    procedure SetSendString(const Value: string);
  protected
    procedure Execute; override;
    procedure Sending(const AValue: string);
  public
    constructor Create; virtual;
    destructor Destroy; override;
    property SendString: string write SetSendString;
  end;
//////////////////////////////////////////////////////
constructor TCustomThreadSenderTCP.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
  Priority := tpNormal;
  FSocket := 0;
  FMutex := False;
  FSendList := TSendList.Create;
end;
//////////////////////////////////////////////////////

procedure TCustomThreadSenderTCP.SetSendString(const Value: string);
begin
  FSendList.Add(Value);
  FMutex := True;
end;
/////////////////////////////////////////////////////
procedure TCustomThreadSenderTCP.Execute;
var
  xSend: String;
  Count: integer;
begin
  try
    while not Terminated do
    begin
      Count := FSendList.Count;
      if Count > 0 then
      begin
        xSend := FSendList[0];
        Sending(xSend);
        FSendList.Delete(0);
      end
      else
      begin
        // Вот тут хочу поток приостанавливал свою работу!!
        // есть у потока свойство Mute
      end;
      Sleep(200);
    end;
  except

  end;
end;
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 16:40   #4
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Suspend, Resume - использую их в делфи они кросплатформены
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 16:42   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Suspend извне плохо по причине непредсказуемости. Поток залочил чего-либо и остановлен. Чего будет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2015, 16:51   #6
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

У меня поток ни чего не лочит
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 16:58   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

B Synchronize нет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.04.2015, 17:23   #8
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

ну я буду использвоать Queue для синхронизации в случае появления ошибки
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 17:27   #9
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Ну ващет компилятор ругается)

Код:
[dcc32 Warning] Eidos.Socket_New.pas(417): W1000 Symbol 'Suspend' is deprecated
Dozent вне форума Ответить с цитированием
Старый 21.04.2015, 18:34   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это предупреждение а не ругань. По-моему Suspend заменен ввиду морального устаревания в новых Делфи, но вот на что не помню.
Кажется на sleep()
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение работы потока. S_Yevgeniy Помощь студентам 8 25.03.2011 12:56
Стабилизация работы потока(TThead) ArtGrek Общие вопросы Delphi 18 19.03.2011 21:56
Приостановка потока bulldog5293 Работа с сетью в Delphi 19 19.11.2010 18:37
Приостановка\продолжение потока bulldog5293 Общие вопросы Delphi 6 20.09.2010 21:47
Приостановка цыкла for to do и дальнейшее продолжение работы s1d0r Общие вопросы Delphi 4 27.05.2009 16:58