จะแยกแยะการดำเนินการใดที่เสร็จสมบูรณ์ในเธรดการประมวลผล IOCP ได้อย่างไร

แอปพลิเคชันของฉันสามารถส่งและรับข้อมูลจากไคลเอนต์โดยใช้ WSASend และ WSARecv ได้พร้อมกัน ดังนั้นจะแยกแยะได้อย่างไรว่าการดำเนินการใดเสร็จสมบูรณ์ในเธรดการประมวลผล IOCP (ส่งหรือรับ)

BOOL bReturn = GetQueuedCompletionStatus(srv.m_hCompPort, &dwBytesTransfered, (LPDWORD)&lpContext, &pOverlapped, INFINITE);

ฉันคิดว่าฉันสามารถใช้โครงสร้าง OVERLAPED เพื่อจุดประสงค์นี้ได้ แต่ฉันทำไม่ได้ มีความคิดอะไรบ้าง?

ขอบคุณ!


person Tutankhamen    schedule 14.06.2013    source แหล่งที่มา


คำตอบ (1)


วิธีแก้ปัญหานั้นง่ายมาก:

struct iOverlaped : public OVERLAPPED{
    enum Type {
        Send,
        Receive
    };
    iOverlaped(Type type_ ) {
        ZeroMemory(this, sizeof(iOverlaped));
        type = type_;
    }

    Type type;
};

และสำหรับทุกการเชื่อมต่อ เราต้องสร้างอินสแตนซ์ที่ทับซ้อนกันสองอินสแตนซ์ (หนึ่งอินสแตนซ์ต่อประเภทการดำเนินการแต่ละประเภท) ...

person Tutankhamen    schedule 14.06.2013
comment
จริงๆ แล้ว คุณต้องสร้างหนึ่งอินสแตนซ์ที่ทับซ้อนกันต่อการดำเนินการที่จะใช้งานพร้อมกัน ดังนั้นหากคุณเพียงออกการอ่านของคุณจากการเสร็จสิ้นการเขียนและการเขียนของคุณจากการเสร็จสิ้นการอ่านของคุณแล้ว คุณจำเป็นต้องมีเพียงอย่างใดอย่างหนึ่ง หากคุณสามารถอ่านและเขียนได้หลายรายการพร้อมกัน คุณต้องมีโครงสร้างที่ทับซ้อนกันหนึ่งโครงสร้างสำหรับการอ่านและเขียนแต่ละรายการที่สามารถใช้งานได้ ประเด็นสำคัญคือ โครงสร้างที่ทับซ้อนกันเป็นต่อข้อมูลการดำเนินการและคงอยู่ตลอดระยะเวลาของการดำเนินการ และจะต้องไม่ซ้ำกันสำหรับการดำเนินการที่ใช้งานอยู่แต่ละรายการ - person Len Holgate; 15.08.2013