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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

bel_nikita

#3
витя
Код:
WaitForSingleObject (HandleOfThread, 2000);
Чтоб не мучался :) держи пару классов:
Код:
  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;
}
 
C

crusher

#4
прыемна паглядзець на аб'екта-арыентаваны падыход, каб не перадаваць кожны раз кончаны 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(...);
}

};
 
Статус
Закрыто для дальнейших ответов.