Работа с потоками 2 вопроса

Тема в разделе "MS Visual C++", создана пользователем -, 1 окт 2004.

Статус темы:
Закрыта.
  1. Гость

    сем привет.
    Прошу прощения за глупые вопросы, но у самого что-то нифига не получается.
    Я создаю и запускаю поток, помтом из Execut'а вызываю функцию (которая объявленна внутри класса MyThread)
    Код (Text):
    void __fastcall MyThread::Execute()
    {
    Synchronize(MyFunction);
    }
    Как из функции MyFunction завершить поток, как поймать событие завершения потока и перед завершением выполнить некоторые действия?
    Спасибо.
     
  2. ????

    ???? Гость

    WaitForSingleObject
    The WaitForSingleObject function returns when one of the following occurs:
    • The specified object is in the signaled state.
    • The time-out interval elapses.
     
  3. bel_nikita

    bel_nikita Гость

    витя
    Код (Text):
    WaitForSingleObject (HandleOfThread, 2000);
    Чтоб не мучался :) держи пару классов:
    Код (Text):
      class Thread
    {
    public:
     Thread ( DWORD (WINAPI * pFun) (void* arg), void* pArg)
     {
      _handle = CreateThread (0,
                  0,
                  pFun,
                  pArg,
                  CREATE_SUSPENDED,
                  &_tid);
     }

     ~Thread () { CloseHandle (_handle); }
     void SetPriority(int nPriority){SetThreadPriority(_handle,nPriority);}
     void Resume () { ResumeThread (_handle); }
     void Suspend() { SuspendThread(_handle); }
     void WaitForDeath ()
     {
      WaitForSingleObject (_handle, 2000);
     }
     HANDLE GetHandle() { return _handle; }
    private:
     HANDLE _handle;
     DWORD _tid;   // thread id
    };

    class cActiveObject
    {
    public:
     cActiveObject ();
     virtual ~cActiveObject () {}
     void Kill ();
     void SetPriority(int nPriority){_thread.SetPriority(nPriority);}
    protected:
     virtual void InitThread () = 0;
     virtual void Loop () = 0;
     virtual void FlushThread () = 0;

     static DWORD WINAPI ThreadEntry (void *pArg);

     int       _isDying;
     Thread     _thread;
    };

    inline cActiveObject::cActiveObject ():_isDying (0),
    #pragma warning(disable: 4355) // 'this' used before initialized
     _thread (ThreadEntry, this)
    #pragma warning(default: 4355)
    {
    }

    inline void cActiveObject::Kill ()
    {
     _isDying++;
     FlushThread ();
       _thread.WaitForDeath ();
    }

    inline DWORD WINAPI cActiveObject::ThreadEntry (void* pArg)
    {
     cActiveObject * pActive = (cActiveObject *) pArg;
     pActive->InitThread ();
     pActive->Loop ();
     return 0;
    }
     
  4. crusher

    crusher Гость

    прыемна паглядзець на аб'екта-арыентаваны падыход, каб не перадаваць кожны раз кончаны callback, а ці клас вакна ў цябе зроблен аналагічна? Хе. Там трошкі пахітрэй.
    Каму будзе цікава глядзіцё ніжэй, але спачатку падумайце самі як гэта зрабіць.Нічога цяжкага.























    Адказваю.
    можа хто і няведае.

    ўсе проста.

    class ConcreteWindow : public CommonWindow
    {
    public:

    /*callback not required*/ LRESULT WindowProc(...)
    {return TRUE;}

    void Create(...)
    {
    HWND handle = CreateWindow(..., WindowProc);
    SetWindowLong(handle, (void*)this);
    }

    };

    class CommonWindow
    {
    protected:

    static CALLBACK LRESULT WindowProc(HWND Handle, ...)
    {
    ConcreteWindow*ptr = GetWindowLong(Handle);
    return ptr->WindowProc(...);
    }

    };
     
Загрузка...
Похожие Темы - Работа потоками вопроса
  1. vladis222
    Ответов:
    2
    Просмотров:
    1.676
  2. Vadik(R)
    Ответов:
    3
    Просмотров:
    3.045
  3. Kuklus
    Ответов:
    0
    Просмотров:
    24
  4. Andrey Kha
    Ответов:
    0
    Просмотров:
    37
  5. Hoasker
    Ответов:
    0
    Просмотров:
    65
Статус темы:
Закрыта.

Поделиться этой страницей