TN064: อพาร์ทเม้นท์-Model เธรดในตัวควบคุม ActiveX

หมายเหตุทางเทคนิคนี้อธิบายวิธีการใช้ห้องพักแบบจำลองเธรดในตัวควบคุม ActiveX หมายเหตุว่า เธรดอพาร์ทเม้นท์แบบจำลองสนับสนุนเฉพาะใน Visual c ++รุ่น 4.2 หรือรุ่นที่ใหม่กว่า?

อพาร์ทเม้นท์-Model เธรดคือ?

แบบห้องพักเป็นหลักในการสนับสนุนวัตถุฝังตัว เช่นตัวควบคุม ActiveX ภายในโปรแกรมประยุกต์บนคอนเทนเนอร์ไม่ แม้ว่าโปรแกรมประยุกต์อาจมีหลายหัวข้อ แต่ละอินสแตนซ์ของวัตถุฝังตัวจะถูกกำหนดให้หนึ่ง "อพาร์ทเมนท์ ซึ่งจะดำเนินการบนเธรดเดียวเท่านั้น กล่าวอีกนัยหนึ่ง สายทั้งหมดลงในอินสแตนซ์ของตัวควบคุมจะเกิดขึ้นบนเธรดเดียว?

อย่างไรก็ตาม อินสแตนซ์อื่นของชนิดตัวควบคุมเดียวกันอาจถูกกำหนดให้กับอพาร์ทเมนต์ที่แตกต่างกัน ดังนั้น ถ้าข้อมูลใด ๆ ในทั่วไป (ตัวอย่างเช่น แบบคงที่ส่วนกลางข้อมูล) หลายอินสแตนซ์ของตัวควบคุมที่ใช้ร่วมกัน แล้วเข้าถึงข้อมูลที่ใช้ร่วมกันนี้จะต้องได้รับการป้องกัน โดยการซิงโครไนส์วัตถุ เช่นเป็นส่วนสำคัญ?

สำหรับกรอกรายละเอียดบน apartment threading แบบ โปรดดู กระบวนการและหัวข้อในการOLE Programmer's Reference?

เหตุผลสนับสนุนอพาร์ทเม้นท์-Model เธรด?

ตัวควบคุมที่สนับสนุนเธรดอพาร์ทเม้นท์รุ่นสามารถใช้ในโปรแกรมประยุกต์ไม่คอนเทนเนอร์ที่ยัง สนับสนุนรูปแบบห้องพัก ถ้าคุณไม่ต้องการเปิดห้องพักแบบจำลองเธรด คุณจะจำกัดชุดอาจเกิดขึ้นของคอนเทนเนอร์ที่ควบคุมคุณสามารถใช้?

การเปิดใช้งานเธรดอพาร์ทเม้นท์แบบจำลองเป็นเรื่องง่ายสำหรับตัวควบคุมส่วนใหญ่ โดยเฉพาะอย่างยิ่งถ้ามีเพียงเล็กน้อย หรือไม่มีข้อมูลที่ใช้ร่วมกัน?

การป้องกันข้อมูลที่ใช้ร่วมกัน

ถ้าข้อมูลที่ใช้ร่วมกัน ใช้ตัวควบคุมของคุณเช่นตัวแปรที่เป็นสมาชิกแบบ static เข้าถึงว่า ข้อมูลควรได้รับการป้องกัน มีส่วนสำคัญในการป้องกันไม่ให้การปรับเปลี่ยนข้อมูลในเวลาเดียวกันมากกว่าหนึ่งเธรด การตั้งค่าส่วนสำคัญสำหรับวัตถุประสงค์นี้ ประกาศตัวแปรแบบ static สมาชิกของคลาสCCriticalSectionในชั้นของตัวควบคุมของคุณ ใช้ฟังก์ชันสมาชิกล็อคและปลดล็อกของวัตถุนี้สำคัญส่วนไหนของรหัสการเข้าถึงข้อมูลที่ใช้ร่วมกัน?

พิจารณา ตัวอย่าง ควบคุมคลาสที่ต้องการในการรักษาสายอักขระที่ใช้ร่วมกัน โดยทั้งหมด สายนี้สามารถเก็บรักษาไว้ในตัวแปรแบบ static สมาชิก และได้รับการป้องกัน โดยส่วนสำคัญ ประกาศคลาสของตัวควบคุมที่จะประกอบด้วยต่อไปนี้:

คลา CSampleCtrl: COleControl สาธารณะ
{
 nbsp  ...
    คง CString _strShared
    คง CCriticalSection _critSect
}(&N)

การใช้งานสำหรับชั้นจะรวมข้อกำหนดสำหรับตัวแปรเหล่านี้:

 int CString CSampleCtrl::_strShared
CCriticalSection CSampleCtrl::_critSect

เข้าไป _strShared แล้วสามารถป้องกันสมาชิกคง โดยส่วนสำคัญ:

โมฆะ CSampleCtrl::SomeMethod()
{
 nbsp  _critSect.Lock()
    ถ้า (_strShared.Empty())
        _strShared = "<text>"
    _critSect.Unlock()
    ...
}

การลงทะเบียนตัวควบคุมอพาร์ทเม้นท์-Model-ทราบ

ตัวควบคุมที่สนับสนุนห้องพักแบบจำลองเธรดควรระบุความสามารถนี้ในรีจิสทรี โดยการเพิ่มค่าชื่อ "ThreadingModel" มีค่าเป็น "ห้องพัก" ในของรายการรีจิสทรี ID คลาสภายใต้คลาส id ของคลาส\InprocServer32คีย์ ทำให้คีย์นี้ที่จะลงทะเบียนโดยอัตโนมัติสำหรับตัวควบคุมของคุณ ผ่าน afxRegApartmentThreading ธงในพารามิเตอร์เป็นหกAfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
 nbsp  ถ้า (bRegister)
        กลับ AfxOleRegisterControlClass (
            AfxGetInstanceHandle()
            m_clsid
            m_lpszProgID
            IDS_SAMPLE
            IDB_SAMPLE
            afxRegApartmentThreading
            _dwSampleOleMisc
            _tlid
            _wVerMajor
            _wVerMinor);
    อื่น
        กลับ AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}(&N)

ถ้าโครงการควบคุมของคุณถูกสร้าง โดย ControlWizard ใน Visual c ++เวอร์ชั่น 4.1 หรือสูงกว่า ธงนี้จะนำเสนอในรหัสของคุณ ไม่มีการเปลี่ยนแปลงจำเป็นในการลงทะเบียนแบบ threading?

ถ้าโครงการของคุณที่สร้าง ด้วยรุ่นก่อนหน้าของ ControlWizard รหัสที่มีอยู่ของคุณจะมีค่าบูลีนเป็นพารามิเตอร์หก ถ้าพารามิเตอร์ที่มีอยู่เป็น TRUE เปลี่ยนไป afxRegInsertable | afxRegApartmentThreading ถ้าพารามิเตอร์ที่มีอยู่เป็น FALSE เปลี่ยนไป afxRegApartmentThreading?

ถ้าตัวควบคุมของคุณไม่เป็นไปตามกฎสำหรับห้องพักแบบจำลองเธรด คุณต้องไม่ผ่านการ afxRegApartmentThreading ในพารามิเตอร์นี้?

หมายเหตุด้านเทคนิคตามหมายเลข|nbsp หมายเหตุด้านเทคนิคตามประเภท(&N)

Index