|
지난번 하신 질문의 답변을 잘 읽어보시면 답이 있습니다.
그리고 여기 검색해 봐도 나오구요
간단한 샘플 만들어서 올립니다. 참조하세요
//===================Unit2.h 파일 ==============================================
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TMyThread : public TThread
{
private:
TThreadMethod Proc;
protected:
void __fastcall Execute();
public:
__fastcall TMyThread(bool CreateSuspended);
__fastcall TMyThread(bool CreateSuspended,TThreadMethod proc);
void __fastcall TMyThread::SetProcess(TThreadMethod proc);
};
//---------------------------------------------------------------------------
#endif
//===================Unit2.cpp 파일 ==============================================
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended)
: TThread(CreateSuspended)
{
Proc=NULL;
}
//---------------------------------------------------------------------------
__fastcall TMyThread::TMyThread(bool CreateSuspended,TThreadMethod proc)
: TThread(CreateSuspended)
{
Proc=proc;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::SetProcess(TThreadMethod proc)
{
Proc=proc;
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
FreeOnTerminate = true;
if(Proc) Synchronize(Proc);
}
//===================Unit1.cpp 파일 ==============================================
void __fastcall TForm1::FormThreadProc(void )
{
ShowMessage("잘되나?");
}
//---------------------------------------------------------------------------
#include "Unit2.h"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TThreadMethod proc;
proc= FormThreadProc;
TMyThread *tred=new TMyThread(false,proc);
}
//---------------------------------------------------------------------------
그럼....
신우철 님이 쓰신 글 :
: 하루를 꼬박 생각해도 답이 없네요 ㅜㅜ
: 질문할 사항은 제가 IOCP를 만들고자 합니다 winsock2.h를 사용해서 말이죠
: 그런데 문제는 쓰레드 생성입니다
: 일단 소스를 보시면
:
: ------------------------------------------------------------------------
: IOCP.h
: ------------------------------------------------------------------------
: #include ListenThread.h
: class CIOCP
: {
: public:
: sock m_client;
: CListenThread *m_pListen;
: void Init();
: void LitenProc();
: }
: ------------------------------------------------------------------------
:
:
:
:
: ------------------------------------------------------------------------
: CIOCP.cpp
: ------------------------------------------------------------------------
: void CIOCP::Init()
: {
: m_pListen = new CListenThread();
: m_pListen->setproc(&CIOCP::LitenProc)
: }
: void LitenProc()
: {
: while(true)
: {
: if(FD_ACCEPT)
: {
: m_client = ACCEPT();
: .
: .
: .
: }
: }
: }
: ------------------------------------------------------------------------
:
:
:
:
: ------------------------------------------------------------------------
: ListenThread.h
: ------------------------------------------------------------------------
: #include IOCP.h
: typedef void(CIOCP::*proc)(void);
: class CListenThread :public TThread
: {
: public:
: proc m_proc;
: void setproc(proc pproc);
:
: }
: ------------------------------------------------------------------------
:
:
:
:
: ------------------------------------------------------------------------
: ListenThread.cpp
: ------------------------------------------------------------------------
: void CListenThread::setproc(proc pproc)
: {
: m_proc = pproc;
: }
:
: void __fastcall CListenThread::Excute()
: {
: (CIOCP->*m_proc)();
: }
: ------------------------------------------------------------------------
:
: 이렇게 할려고 하는데 결국은 두개의 파일에서 참조를 해야하고 그렇게 되면 상호참조
: (typedef void(CIOCP::*proc)(void);)에러가 떨어집니다
: 도저히 답이 없네요 결국은 CreateThread 를 사용해야 하는것 같은데 거기에 들어가는
: Thread함수 또한 DWORD WINMAIN 함수네임() 이렇게 선언을 해야 하고 이함수가 CIOCP 클래스
: 내에서 선언을 하면 에러가 나더라고요 뭐 좋은 방법이 없을까요
: 고맙게도 많은 분들이 여기에 답변을 주셨는데 제가 원하는 답변이 아니라서 자세히 소스와 함께
: 다시 올립니다
: 다시 한번 말씀드리자면 제가 원하는건 쓰레드 클래스를 하나 만들고 그 쓰레드 클래스 내에서
: 즉 Excute() 내에서 작업을 하는게 아니고 메인클래스에서 쓰레드 작업을 하고 싶은겁니다
: 이렇게 하는 이유는 모든 작업들에 필요한 변수들은 CIOCP 클래스에 선언이 되어 있으니까요
: 그렇다고 CIOCP 에서 쓰레드를 상속받을수도 없죠 다중 쓰레드를 생성 할거니까요
: 제발 좋은 방법이 없을까요 깔끔하고 안정적인 그런 방법이요 부탁좀 드립니다
:
: 아 그리고 또 한가지 질문이 있는데 제가 프로젝트에 C++Builder 6.0에서 작업을 하는데
: 위에 파일 네임이 있잖아요 탭으로 거기에 CIOCP.cpp CIOCP.h 이렇게 두개의 텝이 있는데
: 원래대로라면 하나의 탭에서 Ctl + F6를 누르면 한텝에서 CIOCP.cpp CIOCP.h 이게 두개 번갈아 가면서 보여야
: 하는거 아닌가요 왜 저는 두개의 텝으로 나오나요??
: 이상 허접한 질문이었습니다 답변 꼭 부탁 드립니다
|