Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread - как остановить? 
:(
    Опции темы
Nuzur
Дата 13.2.2005, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Цитата(Coocky @ 11.2.2005, 22:51)
Че-то я проморозился и морозиться продолжаю smile
Ну ладно,пора браться за старое smile
alien_by
А если не работаю с производным классом от СWinThread? smile
Вообще для остановки потока я знаю три способа:
1.Остановка с помощю задание флага,используя глобальную переменную(примитивно и неактуально)
2.Способ предложеный(похожий) на alien_by,с помощью отправки своего сообщения.
3.С помощью класса CEvent.
Если еще интересно ответь,я напишу с примерами.

Интерестно, в данном проекте уже вроде как-то прокатило и с ликом, но в жизни пригодиться это точно.
Тоесть если вам не сложно, то я буду очень признателен smile Вот.


--------------------
Never again...
PM MAIL   Вверх
Nuzur
Дата 22.2.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Ну так где там примеры? Мне ведь интерестно!


--------------------
Never again...
PM MAIL   Вверх
Coocky
Дата 22.2.2005, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Секунду Nuzur,ща горю...Курсовая... smile Точно будет в четверг smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Nuzur
Дата 11.3.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Последний раз поднимаю.


--------------------
Never again...
PM MAIL   Вверх
Coocky
Дата 11.3.2005, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Nuzur
Завтра,гадом буду smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 11.3.2005, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



А можно послать MFC и утворить:
Код

class Thread
{
public:
    Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg)
    {
        _handle = CreateThread (
            0, // Security attributes
            0, // Stack size
            pFun,
            pArg,
            CREATE_SUSPENDED,
            &_tid);
    }
    ~Thread () { CloseHandle (_handle); }
    void SetPriority(int nPriority){
#ifndef WINPLATFORM    
        SetThreadPriority(_handle,nPriority);
#endif
    }
    void Resume () { ResumeThread (_handle); }
    void Suspend() { SuspendThread(_handle); } 
    void WaitForDeath ()
    {
        WaitForSingleObject (_handle, 2000);
    }
    HANDLE GetHandle() { return _handle; }
    DWORD GetID() {return _tid; }
private:
    HANDLE _handle;
    DWORD  _tid;     // thread id
};

class cAdvancedActiveObject
{
public:
    cAdvancedActiveObject ();
    virtual ~cAdvancedActiveObject () { Stop(); }
    virtual bool Start(char *chThreadName = "");
    virtual bool Stop();
    bool Started() { return (_thread != NULL); };
    virtual bool SetPriority(int nPriority);
protected:
    virtual void InitThread () {};
    virtual void Loop () = 0;
    virtual void FlushThread () {};

    static DWORD WINAPI ThreadEntry (void *pArg);

    int            _isDying;
    Thread *    _thread;
};
/*
in derived class's destructor you should call use Stop(), else FlushThread won't be called
*/
inline cAdvancedActiveObject::cAdvancedActiveObject () { 
    _thread = NULL;
}
inline bool cAdvancedActiveObject::Start (char *chThreadName) {
    if (_thread)
        return false;
    InitThread();
    _isDying = 0;
    _thread = new Thread(ThreadEntry, this);
    if (!_thread)
        return false;
    _thread->Resume();
#ifndef WINPLATFORM    
#ifdef PHARLAP
    EtsSetThreadDebugName(_thread->GetHandle(), chThreadName);
#endif //PHARLAP
#endif
    return true;
}
inline bool cAdvancedActiveObject::Stop () {
    if (!_thread) 
        return false;
    _isDying++;
    // Let's make sure it's gone
    _thread->WaitForDeath ();
    delete _thread;
    _thread = NULL;
    FlushThread ();
    return true;
}
inline DWORD WINAPI cAdvancedActiveObject::ThreadEntry (void* pArg) {
    cAdvancedActiveObject * p = reinterpret_cast<cAdvancedActiveObject *>(pArg);
    p->Loop ();
    return 0;
}
inline bool cAdvancedActiveObject::SetPriority(int nPriority) { 
    if (!_thread)
        return false;
    _thread->SetPriority(nPriority);
    return true;
}

// Пример
class cTest : cAdvancedActiveObject
{
  cTest() { cAdvancedActiveObject::Start() };
  ~cTest() { cAdvancedActiveObject::Stop() };

  void Loop()  // наш thread
  {
    while (!_isDying)
    {   
        // Типа вечный двигатель :)
    }
  }

};




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 11.3.2005, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



bel_nikita,не понял.Это насчет переменной?
Добавлено @ 23:44
А ,все понятно...Но вижу только 2 способа.А че МФС посылать? smile Разве неудобно? smile


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
bel_nikita
Дата 11.3.2005, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 2
Всего: 47



Coocky
Цитата
А че МФС посылать?

А потому, что я его не знаю smile

З.Ы.: А вообще, треды функциями, типа WaitForSingleObject ..., останавливают


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Coocky
Дата 12.3.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Цитата
А вообще, треды функциями, типа WaitForSingleObject ..., останавливают

Да,и это считается нормальным и правильным!Но есть и другие методы-иногда похабные,но простые.Короче завтра напишу-если че прочтешь:-)


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 12.3.2005, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Итак,как обещал
1 Способ-глобальные переменные.Не лучший способ-небезопасен.
Итак заводим перемную,КОТОРУЮ добавлем вверху,сразу после endif;
Обьявляем ее так votalite bool Stop;(votalite-это означает,что вне потока!)
Присваиваем ей значение Stop=true;
И теперь в функции потока (MyPotok() ;) пишем
Код

UINT MyPotok(LPVOID param)
{
while (Stop)
{
// Код Потока
}
}

//Когда нужно остановить-пишем Stop=false;
//Все smile 

2 Способ тебе описали -это с помощью сообщения.Повторятся не буду. smile
3 Способ.CEvent
Создаем глобальные обьекты CEvent Start и CEvent Stop ;
Добавляем #include "afxmt.h"
Для установки в состояние сигнализации делаем Start.SetEvent(); Stop.SetEvent();(там где раньше true и false)
и теперь функция
Код

UINT MyPotok(LPVOID param)
{
::WaitForSingleObject (Start.m_hobject,INFINITE);

BOOL Potok=TRUE;

while (Potok)
{
// Код Потока
int result=:WaitForSingleObject (Stop,m_hobject,0);
if (result==WAIT_OBJECT_0)
Potok=FALSE;
}
return 0;
}


Все понятно или обьяснить.Если не поймешь что к чему,пиши -обьясню на пальцах smile

Это сообщение отредактировал(а) Coocky - 12.3.2005, 23:48


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Coocky
Дата 12.3.2005, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Да, добавлю.Последний способ-єто сигнализация обьекта CEvent.
Когда Start переведется в состоянии сигнализации,функция начнет работать.
Поток входит в цикл while,где віполняется опрос обьекта собітия Stop.Цикл продолжается до тех пор,потка обьект Stop не будет переведен в состояние сигнализации,и выйдем.
Извини,че не так с синтаксисом-пишу с головы и в плохом состоянии smile
Если че не так исправлю.Когда протрезвею
Удачи.Побежал smile

Это сообщение отредактировал(а) Coocky - 12.3.2005, 23:48


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Олег М
Дата 14.3.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: нет
Всего: 7



Coocky, smile Базара нет, круто! Только непонятно зачем.
Идея здесь уже была написана, просто повторю.
Поток - это цикл (в общем случае), поэтому, если не нужно использовать CWinThread, а его им лучше пользоваться только когда потоку необходимо передавать сообщения типа SenMessage (чем лично я никогда не пользовался - не было нужды), все делают так
Код

bool volatile bContinue=false;

void Class::StartTherad......
{
bContinue=true;
hThread=beginthreadex(....);
............
}

void Class::StopTherad......
{
bContinue=false;
WaitForSingleObject(hThread);
}

unsigned __stdcall ThreadFunc( void* pArguments )
{
      while(bContinue)
     {
      .........................
     }
}


Объявляем глобальную, по отношению к функции потока, переменную и зацикливаем поток до тех пор, пока кто-то не изменит её значение (остановит поток). Так как поток в основном ждёт чего-то (WaitFor....Object), то такой цикл не будет занимать много процессорного времени.
Функцию Sleep лучше не использовать, потому что из неё невозможно корректно выйти, без TerminateThread.


Это сообщение отредактировал(а) Олег М - 14.3.2005, 22:11
PM MAIL ICQ   Вверх
Coocky
Дата 15.3.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Олег М
Я не понял твоей иронии.Я человеку показываю все доступные методы,а его выбор,чем пользоваться smile
Цитата
Только непонятно зачем.


Зачем-ЧТО?

Nuzur
И еще.Во всех приведеных примерах ты посылал ПОТОКУ команду из главной проги,когда остановиться.
Но есть ситуация,когда ПОТОК должен сказать проге,что мне пора бы остановиться.Для этого регистрируешь свое сообщение,и когда поток должен сказать-все хватит,отправляешь из него это сообщение.А в обработчике своего сообщения ставишь обьекты или переменные в нужное состояние.И все происходит как выше...

Это сообщение отредактировал(а) Coocky - 15.3.2005, 14:06


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Олег М
Дата 15.3.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: нет
Всего: 7



Цитата(Coocky @ 15.3.2005, 14:05)
Зачем-ЧТО?

Зачем использовать событие в качестве булевской переменной
PM MAIL ICQ   Вверх
Coocky
Дата 16.3.2005, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Олег М
Цитата
Зачем использовать событие в качестве булевской переменной

А что в этом плохого?
Нормальный подход..А чем он хуже твоего? smile



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.