Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как остановить поток?! Plz heeeelp!  (Прочитано 13398 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 04-12-2005 14:59 » 

Промучился весь день проект горит!   Вот такой я вот Нужно было сделать поток в драйвере взял пример из DDK написал простенький поток с таймером чтобы систему не вешал:

VOID ReadThreadProc(IN PVOID Context)
//
//Read thread proc
//
{
    PHW_DEVICE_EXTENSION DevExtension =  Context;
    NTSTATUS    Status;
   LARGE_INTEGER time;

    //Diagnostic
    DbgPrint("\nEnter to thread proc!\n");
   
   //Set priorety
    KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY );

   //Set timer for delay
    KeInitializeTimer(&DevExtension->DelayTimer);
   

    //main thread LOOP
    while( TRUE ){

   //Wait for timer
   DbgPrint("\nWait timer...\n");
    time.QuadPart = (LONGLONG) -100*1000*10;//1c
     KeSetTimer(&DevExtension->DelayTimer, time, NULL);

    KeWaitForSingleObject(&DevExtension->DelayTimer,
                                 Executive,
                                 KernelMode,
                                 FALSE,             // Not allertable
                                 NULL);             // No timeout structure

    DbgPrint("\nTimer works!\n");

//      KeWaitForSingleObject(&DevExtension->IrpQueueSemaphore,
//                            Executive,
//                            KernelMode,
//                            FALSE,
//                            NULL );


   //If thread should stop
     if(DevExtension->ThreadShouldStop) {//You must free all thread's resources here!
      PsTerminateSystemThread( STATUS_SUCCESS );
       }//if(DevExtension->ThreadShouldStop)

    } // main thread LOOP
}

2 функции управления потоком:

void RunReadThread(IN PHW_DEVICE_EXTENSION  DriverExtention)
//
//Run reading thread.
//
{
NTSTATUS status;
HANDLE  ReadThreadHandle=0;//ReadThread handle
//OBJECT_ATTRIBUTES ObjAttributes;


   //Diagnostic
    DbgPrint("\nTry to create reading thread\n");

   //Run thread
    DriverExtention->ThreadShouldStop=FALSE;

//    InitializeObjectAttributes(&ObjAttributes, NULL,
//                                   OBJ_KERNEL_HANDLE,
 //                                  NULL,
 //                                  NULL);


    status = PsCreateSystemThread(&ReadThreadHandle,
                                (ACCESS_MASK)0,
                        NULL,            //&ObjAttributes,
                                (HANDLE) 0,
                                NULL,
                                ReadThreadProc,
                                DriverExtention );
   //Diagnostic
    if(status!=STATUS_SUCCESS)
     DbgPrint("\nReading thread not created!\n");

    else DbgPrint("\nReading thread created!\n");

   
    // Convert the Thread object handle into a pointer to the Thread object
    // itself. Then close the handle.
    //
   
    ObReferenceObjectByHandle(ReadThreadHandle,
                            THREAD_ALL_ACCESS,
                            NULL,
                            KernelMode,
                            &DriverExtention->ThreadObject,
                            NULL );

   ZwClose(ReadThreadHandle);

}

void StopReadThread(IN PHW_DEVICE_EXTENSION  DriverExtention)
//
//Stop reading thread.
//
{

   //Diagnostic
    DbgPrint("\nTry to stop thread\n");

   //Stop thread
    DriverExtention->ThreadShouldStop=TRUE;
    //
    // Wait for the thread to terminate
    //
    KeWaitForSingleObject(&DriverExtention->ThreadObject,
                        Executive,
                        KernelMode,
                        FALSE,
                        NULL );

    ObDereferenceObject(&DriverExtention->ThreadObject);

DbgPrint("\nReading thread stoped!\n");

}

Так вот поток запускается нормально и даже работает   Здесь была моя ладья... но при любой попытке его остановить или вызвать  StopReadThread он просто без всяких сообщений и ошибок тупо перегружает компьютер... Перепробовал уже все на что только фантазии хватило не работает! Быть такого не может
PLEASE HEEEEEEEEELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  Жаль
« Последнее редактирование: 17-12-2007 05:07 от Алексей1153++ » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
ILIS
Гость
« Ответ #1 : 05-12-2005 09:21 » 

А функция PsTerminateSystemThread точно срабатывает?(может до нее не доходит дело...)
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 05-12-2005 09:44 » 

Да черт его знает... как я проверю если у меня сразу комп перезагружается...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 05-12-2005 09:47 » 

USBLexus , если по срочному, то мона  ч/з Ж сделать - по некоему флагу останавливать поток. То есть поток знает указатель на некий флаг, и если флаг поднят - поток самоостанавливается
Записан

USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 05-12-2005 10:14 » 

Так это и есть флаг:
   //If thread should stop
     if(DevExtension->ThreadShouldStop) {//You must free all thread's resources here!
      PsTerminateSystemThread( STATUS_SUCCESS );
       }//if(DevExtension->ThreadShouldStop)
« Последнее редактирование: 20-12-2007 18:02 от Алексей1153++ » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 05-12-2005 10:15 » 

DevExtension->ThreadShouldStop - BOOL
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 05-12-2005 10:26 » 

а зависает когда KeWaitForSingleObject() ?

тогда продолжаем ч/з Ж :

//main thread LOOP
    while(!DevExtension->ThreadShouldStop)
{
}

а вот это внутри потока у тебя надо убрать, имхо:

//If thread should stop
     if(DevExtension->ThreadShouldStop) {//You must free all thread's resources here!
      PsTerminateSystemThread( STATUS_SUCCESS );
       }//if(DevExtension->ThreadShouldStop)

    } // main thread LOOP
}
« Последнее редактирование: 20-12-2007 18:07 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 05-12-2005 10:28 » new

кроме того, если надо дождаться окончания потока без хитростей, то в конце тела потока (перед "return") - ещё один флаг ввести. И ждать до момента, пока поток этот флаг сбросит. А потом для надёжности ещё Sleep(1).

Записан

ILIS
Гость
« Ответ #8 : 05-12-2005 11:35 » 

А еще лучше  в схеме, описанной Алексей1153 , булевую переменную заменить мьютексом и ждать через KeWaitForsingleObject вместо таймера. Но все таки интересно доходит ли дело до вызова PsTerminateSystemThread, разве трудно отладчиком проверить?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 05-12-2005 11:41 » 

> интересно доходит ли дело до вызова PsTerminateSystemThread

мне одно не понятно - зачем PsTerminateSystemThread вызывается внутри потока?
Записан

ILIS
Гость
« Ответ #10 : 05-12-2005 11:44 » 

Потому что PsTerminateSystemThread убивает текущий поток, убить поток извне в кернеле нельзя
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 06-12-2005 03:02 » 

Потому что PsTerminateSystemThread убивает текущий поток, убить поток извне в кернеле нельзя
Вообщето PsTerminateSystemThread уивает поток изнутри а не извне

С сабжем разобрался Всем спасибо
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #12 : 06-12-2005 03:05 » 

тьфу блин
ILIS предыдущий пост не тебе был

> интересно доходит ли дело до вызова PsTerminateSystemThread

мне одно не понятно - зачем PsTerminateSystemThread вызывается внутри потока?
Короче ILIS сказал уже)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines