หมายเหตุทางเทคนิคนี้อธิบายวิธีการใช้ห้องพักแบบจำลองเธรดในตัวควบคุม 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)