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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2010, 03:52   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Как проверить дескриптор (указатель) на правильность?

Есть массив потоков, у которых стоит FreeOnTerminate, а при закрытии формы у всех этих потоков вызывается Terminate. Т.о. иногда при закрытии формы вылезает ошибка "Неверный десриптор". Как этого избежать? Это возникает из-за того, что некоторые потоки уже "освободились")
TwiX вне форума Ответить с цитированием
Старый 13.02.2010, 07:43   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

У потока есть событие OnTerminate, возникающее, когда поток заканчивает свою работу. Назначьте на него свой обработчик, в котором ищите в массиве поток, вызвавший это событие, и обнуляйте ссылку на него. А уже при закрытии формы, перед вызовом Terminate, проверяйте обнулена ли ссылка.
maxionans вне форума Ответить с цитированием
Старый 13.02.2010, 17:05   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Спасибо) Я думал она обнуляется когда поток уничтожается)
А terminate вызывается всегда по окончанию Execute?
TwiX вне форума Ответить с цитированием
Старый 13.02.2010, 20:41   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

А как проверить обнулена ли ссылка?
Пробовал так:
Код:
if not thrds[i]=nil then
Ругается:
Цитата:
[DCC Error] frm***.pas(56): E2015 Operator not applicable to this operand type
TwiX вне форума Ответить с цитированием
Старый 13.02.2010, 21:03   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

У потоков есть свойство Terminated
В справке напиши
"TThread,Terminated"
psycho-coder вне форума Ответить с цитированием
Старый 13.02.2010, 21:07   #6
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Я с начала его и хотел использовать, но почему-то не нашёл... Есть только метод Terminate...
TwiX вне форума Ответить с цитированием
Старый 13.02.2010, 21:12   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
property Terminated: Boolean;
Код:
procedure TMyClientThread.Execute;

var
  TheStream: TWinSocketStream;
  buffer: string;
begin
  { create a TWinSocketStream for reading and writing }
  TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
  try
    { fetch and process commands until the connection or thread is terminated }
    while (not Terminated) and (ClientSocket1.Active) do
    begin
      try
        GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }

        { write the request to the server }
        TheStream.Write(buffer, Length(buffer) + 1);
        { continue the communication (eg read a response from the server) }
        ...
      except
        if not(ExceptObject is EAbort) then
          Synchronize(HandleThreadException); { you must write HandleThreadException }
      end;
    end;
  finally
   TheStream.Free;
  end;
end;
psycho-coder вне форума Ответить с цитированием
Старый 13.02.2010, 21:35   #8
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Да знаю я, что у потоков есть такое свойство.
Пробелма в том, как сделать его публичным.
TwiX вне форума Ответить с цитированием
Старый 13.02.2010, 21:40   #9
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Хм... Да, не подумал....
Может по хендлу?
Код:
if Thread1.Handle <> nil then <Что-то>
psycho-coder вне форума Ответить с цитированием
Старый 13.02.2010, 21:47   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Точно не понял проблемы. Вам известно что существуют технологии синхронизации потоков в Windows ?
Как пример, создаете для каждого потока либо Mutex, либо Event (сохраняя их в массив). Ну или просто запоминайте каждый поток созданные (а именно его handle). По завершении главного потока (закрытие главного окна и т.п.) вызывайте WaitForMultipleObjects указывая при этом, либо массив Mutex, Events, Handles и т.п.. т.е. главный поток не завершиться пока не завершатся все дочерние. Само собой, вызвать каждому потоку Terminate (если в главном цикле потока проверяется его свойство ну или свой аналог.), короче говоря сообщить дочернему потоку что ему стоит завершаться.
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано число в двоичной системе счисления. Проверить правильность ввода этого числа isus Помощь студентам 2 29.11.2009 23:32
Нужно проверить на правильность программу Killdgedan Помощь студентам 3 26.05.2009 00:45
Прошу помощи. Нада проверить правильность составления проги. И помочь исправить ошибку Ascor Общие вопросы C/C++ 4 03.06.2008 10:54
проверить правильность расстановки операторов begin и end Тёмка Помощь студентам 1 10.12.2007 13:07