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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2012, 22:58   #1
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию Поток блокирует выполнение другого потока

Пытаюсь сделать много поточный веб-сервер, туплю в одном месте:
Есть поток который в цикле принимает клиентов

Код:
procedure TListener.Listen;
var
ClientSocket:TSocket;
addr:TSockAddr;
addrLength:integer;
begin
  addMessage('Start Listen');
  addrLength:=sizeOf(addr);
  while not terminated do
  begin
    addMessage('Listen');
    ClientSocket:=accept(ServerSocket, @addr, @addrLength);
    if ClientSocket <> INVALID_SOCKET then
      addClient(ClientSocket);
  end;
end;
Когда мы приняли клиента создаем новый поток присваиваем ему сокет и запускаем
Код:
procedure addClient(sock:TSocket);
begin
  addMessage('addClient');
  setLength(clients, length(clients)+1);
  clients[length(clients)-1]:=ClientThread.Create(true);
  clients[length(clients)-1].ClientSocket:=sock;
  clients[length(clients)-1].Execute;
end;
Тут обрабатываем сообщения клиента
Код:
procedure ClientThread.Execute();
begin
  addMessage('Client start');
  while not Terminated do
  begin
end;
end;
Проблема в том что ClientThread.Execute(); блокирует выполнение TListener.Listen то есть постоянно работает тот пустой цикл.
Непонятно почему, ведь он в другом потоке.
Levsha100 вне форума Ответить с цитированием
Старый 05.04.2012, 23:21   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не нужно вызывать Execute потока.
это внутренний метод, и поток сам его вызовет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2012, 23:27   #3
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

А как запустить поток если я не запускаю его в ClientThread.Create(true); ?
Levsha100 вне форума Ответить с цитированием
Старый 05.04.2012, 23:29   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Метод Resume
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.04.2012, 23:33   #5
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Спасибо
Levsha100 вне форума Ответить с цитированием
Старый 06.04.2012, 08:05   #6
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

кто подчищает массив clients от дохляков?
если другой поток то имеется грабля многопоточного доступа
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ из другого потока Invoke delias C# (си шарп) 17 06.06.2013 22:33
[C#] Изменение текста label1 из другого потока/класса GregRUS Помощь студентам 3 11.01.2012 09:24
Быстрый вызов метода формы из другого потока Swarog Общие вопросы Delphi 3 21.05.2011 20:34
Создание потока,передача функции в поток asdasys Помощь студентам 4 25.02.2011 17:30
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50