กันยายน 15, 2019, 01:34:20 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: User Threads vs. Function Pointers  (อ่าน 2220 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« เมื่อ: กรกฎาคม 05, 2013, 10:05:26 pm »

Class (*.h/*.hpp)
Code: (c)
class XComm
{
    public:
       HANDLE EventHandle;
       HANDLE ThreadHandle;
       DWORD  ThreadId;
       bool   RunFlag;
       unsigned long Counter;

       XComm(DWORD WINAPI (*pThreadFunction)(void *));
       void End(void);
       unsigned long GetCounter(void){ return(Counter); };
       ~XComm();
};


Class (*.cpp)
Code: (c)
XComm::XComm(DWORD WINAPI (*pThreadFunction)(void *))
{
    RunFlag = true;
    EventHandle  = CreateEvent(NULL, FALSE, FALSE, NULL);
    ThreadHandle = CreateThread(NULL, 0, pThreadFunction, (void *)this, 0, &ThreadId);
}

void XComm::End(void)
{
   RunFlag = false;
   WaitForSingleObject(ThreadHandle, INFINITE);
   CloseHandle(EventHandle);
   CloseHandle(ThreadHandle);
}

XComm::~XComm()
{
    if(RunFlag){
       End();
    }
}


User Level
Code: (c)
XComm *obj1, *obj2;

Code: (c)
DWORD WINAPI UserThread1(void *Arg)
{
    XComm *Obj = (XComm *)Arg;
    Obj->Counter = 0;
    while(Obj->RunFlag)
    {
        WaitForSingleObject(Obj->EventHandle, 100);
        Obj->Counter++;
    }
    return(0);
}

DWORD WINAPI UserThread2(void *Arg)
{
    XComm *Obj = (XComm *)Arg;
    Obj->Counter = 0;
    while(Obj->RunFlag)
    {
        WaitForSingleObject(Obj->EventHandle, 150);
        Obj->Counter++;
    }
    return(0);
}




An Example on C++ Builder XE
Code: (c)

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    obj1 = new XComm(UserThread1);
    obj2 = new XComm(UserThread2);
    Button1->Enabled = false;
    Button2->Enabled = true;
    Timer1->Enabled  = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    //obj1->End();
    //obj2->End();
    delete obj1;
    delete obj2;

    Button2->Enabled = false;
    Button1->Enabled = true;

    Timer1->Enabled  = false;
    Form1->Label1->Caption = "Cnt 1";
    Form1->Label2->Caption = "Cnt 2";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Timer1->Enabled  = false;
   Button2->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    Form1->Label1->Caption = obj1->GetCounter();
    Form1->Label2->Caption = obj2->GetCounter();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    if(Button2->Enabled)
    {
       Button2Click(NULL);
    }
}
//---------------------------------------------------------------------------


บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: