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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2010, 14:58   #1
pupkinsoft
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 12
Вопрос Неубиваемый поток

Доброго времени суток.

TerminateThread почему то не убивает поток.
вот код:
Код:
procedure TWatching.Activate(const Value: boolean);
begin
 if Value and not GActive then
   WThread:=CreateThread(nil,0,@ThreadProc,self,CREATE_NEW,tid)
 else TerminateThread(WThread,1);
 GActive:=Value;
end;
сам поток работает нормально.. только вот никак не могу его убить. даже TerminateThread. в чем может быть дело?

//P.S: извиняюсь за ошибки и, может быть, непонятную формулировку. 2ю ночь не сплю(
- В чем заключается многозадачность Windows?
- Она глючит и работает одновременно.
pupkinsoft вне форума Ответить с цитированием
Старый 24.10.2010, 15:01   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

А где ThreadProc?

Включаю внутреннего джедая
BOBAH13 вне форума Ответить с цитированием
Старый 24.10.2010, 15:19   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
 if Value and not GActive then
   WThread:=CreateThread(nil,0,@ThreadProc,self,CREATE_NEW,tid)
 else 
 if not TerminateThread(WThread,1) then RaiseLastWin32Error;
...и после этого текст ошибки в студию
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2010, 15:20   #4
pupkinsoft
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 12
По умолчанию

Код:
begin
 hDir := CreateFile(pchar(sender.FDirectory),GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE
   or FILE_SHARE_DELETE,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
 if hDir = INVALID_HANDLE_VALUE
  then begin
    ShowMessage(SysErrorMessage(GetLastError));
    exit;
  end;
 GetMem(lpBuf,BUF_SIZE);
 repeat
  ZeroMemory(lpBuf,BUF_SIZE);
  if not ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,sender.FdwNotifyFilter,@cReturn,nil,nil)
   then Break;
  Ptr:=lpBuf;
  repeat
   GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
   ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
   lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName,
             PFileNotifyInformation(Ptr).FileNameLength div 2+1);
   exp.FullFileName:=sender.FDirectory+FileName;
   exp.Filename:=FileName;
   FreeMem(FileName);
   case PFileNotifyInformation(Ptr).Action of
    FILE_ACTION_ADDED             : exp.evnt:=('Создание');
    FILE_ACTION_REMOVED           : exp.evnt:=('Удаление');
    FILE_ACTION_MODIFIED          : exp.evnt:=('Изменение');
    FILE_ACTION_RENAMED_OLD_NAME  : exp.evnt:=('Переименование из');
    FILE_ACTION_RENAMED_NEW_NAME  : exp.evnt:=('Переименование в');
    else                            exp.evnt:=('Неопознанная операция');
   end;
   exp.Action:=PFileNotifyInformation(Ptr).Action;
   ext:=ExtractFileExt(LowerCase(exp.Filename));
   if ext<>'' then   delete(ext,1,1);
   if (exp.Filename<>lexp.Filename)or(exp.Action<>lexp.Action) then
    if Assigned(sender.FOnChange) then
     if (sender.FFilter='') or (pos(ext,sender.FFilter)<>0) then
        sender.FOnChange(exp);
   lexp:=exp;
   if PFileNotifyInformation(Ptr).NextEntryOffset=0
    then Break
     else begin
      Inc(Cardinal(Ptr),PFileNotifyInformation(Ptr).NextEntryOffset);
     end;
  until false;
 until false;
 FreeMem(lpBuf);
end;
Цитата:
Сообщение от Stilet Посмотреть сообщение
...и после этого текст ошибки в студию
SystemError Code:6 Неверный дескриптор
- В чем заключается многозадачность Windows?
- Она глючит и работает одновременно.

Последний раз редактировалось Stilet; 24.10.2010 в 15:35.
pupkinsoft вне форума Ответить с цитированием
Старый 24.10.2010, 15:36   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Неверный дескриптор
Ну стало быть WThread ерунду содержит...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2010, 15:40   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вам такие конструкции не смущают?
Код:
repeat ... until false;
Добавьте в тред переменную типа Canceled: Boolean; и ей установите Canceled := false; далее структуру repeat ... until Canceled; после когда захотите завершить поток просто вызывайте [Thread info переменная].Canceled := true; типа такого, надеюсь идея ясна.
BOBAH13 вне форума Ответить с цитированием
Старый 24.10.2010, 19:04   #7
pupkinsoft
Пользователь
 
Регистрация: 16.03.2010
Сообщений: 12
Лампочка великая сила электрического импульса

и переменную добавил, и полностью переписал unit с потоком(вместо class(TObject), сделал class(TThread)). да и пускай не убивается. единственный минус - настройки придется делать при не запущенной программе. всем спасибо.

Добавлено:
P.S.:еще раз огромное спасибо BOBAH13 и Stilet. после полу дневных танцев с бубном заработал первоначальный вариант. вот она великая сила электрического импульса.
- В чем заключается многозадачность Windows?
- Она глючит и работает одновременно.

Последний раз редактировалось pupkinsoft; 24.10.2010 в 23:32. Причина: помогли танцы с бубном
pupkinsoft вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неубиваемый процесс Veiron Общие вопросы Delphi 12 11.12.2011 19:00
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
неубиваемый вирус! все антивирусы не находят его! кто знает как его убрать? Yury111 Безопасность, Шифрование 12 05.06.2009 11:19
Поток Черничный Общие вопросы Delphi 5 27.09.2008 21:23
Сервис NT , причем неубиваемый Virtson Win Api 5 02.03.2007 17:12