เทคโนโลยีการเก็บข้อมูลมีบทบาทสำคัญในการควบคุมทางอุตสาหกรรมและระบบอัตโนมัติและสาขาอื่นๆ กระบวนการทั่วไปในการรวบรวมข้อมูลมีดังนี้:
1.ส่งคำสั่งการเลือกช่องสัญญาณไปยังการ์ดจับภาพ ②เลือกหมายเลขช่องที่จะรวบรวม 3.เริ่มการแปลง A/D ④รอจนกว่าการแปลงจะเสร็จสิ้น ⑤อ่านข้อมูลจากการ์ดการรับข้อมูล สำหรับการรับหลายช่องทาง โดยทั่วไปจะใช้สองวิธีในการออกแบบโปรแกรม วิธีการสืบค้นหรือวิธีการขัดจังหวะ วิธีการสืบค้นที่เรียกว่าคือการใช้ลูปเพื่อรวบรวมแต่ละช่องข้อมูลตามลำดับ ข้อดีของวิธีการสืบค้นคือโปรแกรมนั้นเรียบง่ายและใช้งานง่าย ข้อเสียคือในระหว่างกระบวนการรวบรวม CPU ใช้เวลาส่วนใหญ่ในการรอ ส่งผลให้สิ้นเปลืองทรัพยากร วิธีการขัดจังหวะใช้รูปแบบของการขัดจังหวะด้วยฮาร์ดแวร์ - ขั้นแรกให้เริ่มการแปลง A/D และส่งสัญญาณขัดจังหวะเมื่อสิ้นสุดการแปลง - CPU จะอ่านข้อมูลที่รวบรวมไว้เมื่อตอบสนองต่อการขัดจังหวะของการ์ดการรับข้อมูล ด้วยวิธีนี้ ในขณะที่รอการแปลง CPU สามารถทำการคำนวณอื่นๆ ได้โดยไม่ต้องอยู่ในสถานะรอ ข้อดีของวิธีการขัดจังหวะคือสามารถใช้ประโยชน์ทรัพยากรได้อย่างเต็มที่ อย่างไรก็ตาม การออกแบบโปรแกรมมีความซับซ้อน โดยเฉพาะอย่างยิ่งเมื่อทรัพยากรขัดจังหวะฮาร์ดแวร์ของระบบมีจำกัด ง่ายต่อการทำให้เกิดข้อขัดแย้งในการขัดจังหวะ นอกจากนี้ ในระบบปฏิบัติการ เช่น Windows หรือ Win95 ผู้ใช้ไม่ได้รับอนุญาตให้ติดตั้งเวลาตัวจัดการขัดจังหวะ แต่ก็ไม่สามารถทำได้
---- สองวิธีที่กล่าวถึงข้างต้นเป็นทั้งสองวิธีภายใต้ DOS; ใน Win95 ขณะนี้มีวิธีที่ดีกว่า - เทคโนโลยีมัลติเธรด ตอนนี้ เราสามารถใช้ประโยชน์จากเทคโนโลยีมัลติเธรดสำหรับการรวบรวมข้อมูลได้
---- 1. ข้อดีของการใช้มัลติเธรดในการรวบรวมข้อมูล
---- สิ่งที่ได้รับความนิยมมากที่สุดเกี่ยวกับ Win95/98 นอกจากอินเทอร์เฟซที่สวยงามแล้ว ก็คือการทำงานแบบมัลติเธรดและการทำงานหลายอย่างพร้อมกัน ในสภาพแวดล้อม DOS โปรแกรมที่รันสามารถผูกขาดทรัพยากรทั้งหมดได้ ในสภาพแวดล้อม Windows แม้ว่าจะเป็นสภาพแวดล้อมการทำงานหลายอย่างพร้อมกันเล็กน้อย แต่โปรแกรมของคุณยังคงสามารถควบคุมเวลา CPU ทั้งหมดได้นานเท่าที่คุณต้องการ อย่างไรก็ตาม ใน Windows95 และ Windows NT โปรแกรมไม่สามารถผูกขาดเวลาดำเนินการ CPU ทั้งหมดได้ ยิ่งไปกว่านั้น โปรแกรมไม่ใช่หนึ่งบรรทัดตั้งแต่ต้นจนจบ ในทางตรงกันข้าม โปรแกรมสามารถแบ่งออกเป็นหลายส่วนของโปรแกรมระหว่างการดำเนินการและดำเนินการพร้อมกัน แฟรกเมนต์ของโปรแกรมเหล่านี้ที่สามารถดำเนินการพร้อมกันเรียกว่าเธรด ใน Windows 95 และ Windows NT ระบบปฏิบัติการสามารถสลับรันโปรแกรมหลายโปรแกรมพร้อมกันได้ ซึ่งเป็นการทำงานหลายอย่างพร้อมกัน
---- การใช้มัลติเธรดสำหรับการรวบรวมข้อมูลสามารถเร่งความเร็วการตอบสนองของโปรแกรมได้อย่างมีประสิทธิภาพและเพิ่มประสิทธิภาพในการดำเนินการ โปรแกรมทั่วไปจะต้องประมวลผลอินพุตของผู้ใช้ แต่เมื่อเปรียบเทียบกับความเร็วในการประมวลผลของ CPU ความเร็วในการอินพุตของผู้ใช้ก็เหมือนกับการเดินหรือการบิน ด้วยวิธีนี้ CPU จะเสียเวลาอย่างมากในการรออินพุตจากผู้ใช้ (เช่น ในสภาพแวดล้อม DOS) หากใช้มัลติเธรด เธรดหนึ่งสามารถใช้เพื่อรออินพุตจากผู้ใช้ ส่วนอีกเธรดสามารถดำเนินการประมวลผลข้อมูลหรืองานอื่นได้ สำหรับโปรแกรมรวบรวมข้อมูล สามารถใช้เธรดแยกต่างหากสำหรับการรวบรวมข้อมูลได้ ด้วยวิธีนี้จึงสามารถรับประกันธรรมชาติของการรวบรวมแบบเรียลไทม์ได้ในระดับสูงสุด ในขณะที่เธรดอื่นๆ สามารถตอบสนองการดำเนินงานของผู้ใช้หรือดำเนินการประมวลผลข้อมูลได้ทันท่วงที มิฉะนั้นโปรแกรมจะไม่สามารถตอบสนองต่อการทำงานของผู้ใช้เมื่อรวบรวมข้อมูลได้ แต่จะไม่สามารถรวบรวมข้อมูลเมื่อตอบสนองต่อการทำงานของผู้ใช้ โดยเฉพาะอย่างยิ่งเมื่อปริมาณข้อมูลที่รวบรวมมีจำนวนมากและงานประมวลผลข้อมูลมีปริมาณมาก การรอนานในระหว่างการรวบรวมเป็นสิ่งที่ยอมรับได้มากหากไม่ได้ใช้มัลติเธรด
---- อย่างไรก็ตาม มัลติเธรดนั้นซับซ้อนกว่าการเขียนโปรแกรมทั่วไปมาก เนื่องจากหลายเธรดอาจดำเนินการพร้อมกันได้ตลอดเวลา ตัวแปรและข้อมูลจำนวนมากอาจถูกแก้ไขโดยเธรดอื่น นี่คือปัญหาการควบคุมการซิงโครไนซ์ที่สำคัญที่สุดระหว่างเธรดในโปรแกรมแบบมัลติเธรด
---- 2. ปัญหาที่ควรแก้ไขโดยมัลติเธรดสำหรับการรวบรวมข้อมูล
---- ที่จริงแล้ว ความซับซ้อนของการเขียนโปรแกรมแบบมัลติเธรดนั้นเกิดขึ้นเพียงชั่วคราว หากคุณใช้ C แบบดั้งเดิมสำหรับการออกแบบแบบมัลติเธรด คุณจะต้องควบคุมการซิงโครไนซ์ระหว่างเธรดด้วยตัวเอง นั่นจะซับซ้อน อย่างไรก็ตาม หากคุณใช้วิธีการออกแบบเชิงวัตถุและใช้ Delphi สำหรับการเขียนโปรแกรมแบบมัลติเธรด ปัญหาจะง่ายกว่ามาก นี่เป็นเพราะว่า Delphi ได้จัดการความซับซ้อนของมัลติเธรดให้เราแล้ว และสิ่งที่เราต้องทำก็แค่สืบทอด
---- โดยเฉพาะการรวบรวมข้อมูลแบบมัลติเธรดจำเป็นต้องทำงานต่อไปนี้ให้เสร็จสมบูรณ์:
---- ① รับคลาส SampleThread ของคุณเองจากคลาส TThread นี่คือคลาสที่เราใช้ในการรวบรวมข้อมูล เมื่อรวบรวม เพียงสร้างอินสแตนซ์ของ SampleThread
---- ② โอเวอร์โหลดวิธี Execute ของ TThread ระดับซุปเปอร์ ในวิธีนี้ งานการเก็บรวบรวมข้อมูลจะดำเนินการโดยเฉพาะ
---- 3 หากคุณต้องการรวบรวมและแสดงผลพร้อมกัน ให้เขียนกระบวนการต่างๆ เพื่อแสดงความคืบหน้าในการรวบรวมเพื่อให้เมธอด Execute เรียกใช้
----แอตทริบิวต์/วิธีการที่ใช้บ่อยที่สุดในคลาส TThread มีดังนี้:
วิธีการสร้าง: ตัวสร้างสร้าง
(สร้างระงับ: บูลีน);
----พารามิเตอร์ CreateSuspended กำหนดว่าเธรดจะถูกดำเนินการทันทีเมื่อถูกสร้างขึ้นหรือไม่ หากเป็น True เธรดใหม่จะถูกระงับหลังจากการสร้าง หากเป็น False เธรดจะถูกดำเนินการทันทีหลังจากการสร้าง
คุณสมบัติ FreeOnTerminate:
คุณสมบัติ FreeOnTerminate: บูลีน;
---- คุณลักษณะนี้กำหนดว่าโปรแกรมเมอร์มีหน้าที่รับผิดชอบในการยกเลิกเธรดนี้หรือไม่ หากคุณสมบัตินี้เป็น True VCL จะทำลายวัตถุเธรดโดยอัตโนมัติเมื่อเธรดยุติ ค่าเริ่มต้นคือเท็จ
คุณสมบัติ OnTerminate:
คุณสมบัติ OnTerminate: TNotifyEvent;
---- คุณลักษณะนี้ระบุเหตุการณ์ที่เกิดขึ้นเมื่อเธรดยุติ
---- ลองดูตัวอย่างที่เฉพาะเจาะจง:
---- 3. การดำเนินการรวบรวมข้อมูลแบบมัลติเธรด
---- เป็นโปรแกรมที่ผู้เขียนพัฒนาขึ้นเพื่อวัดแผนภาพประสิทธิภาพของเครื่องสูบน้ำ หน้าที่ของมันคือรวบรวมข้อมูลการโหลดและการกระจัดของจุดช่วงล่างของชุดปั๊ม จากนั้นจึงสร้างไดอะแกรมการทำงานของชุดปั๊มหลังการประมวลผล รูปที่ 1 (ละไว้) แสดงอินเทอร์เฟซระหว่างการรวบรวมข้อมูล หลังจากคลิกปุ่ม "รวบรวมข้อมูล" โปรแกรมจะสร้างเธรดใหม่และตั้งค่าคุณสมบัติ เธรดใหม่นี้จะทำให้งานรวบรวมข้อมูลเสร็จสมบูรณ์ ขั้นตอนมีดังนี้:
ขั้นตอนตัวอย่างแบบฟอร์ม
DoSampleBtnClick (ผู้ส่ง: TObject);
เริ่ม
ReDrawBtn.Enabled := จริง;
DoSampleBtn.Enabled := เท็จ;
FFTBtn.Enabled := จริง;
TheSampler := SampleThread.Create(เท็จ);
สร้างเธรดคอลเลกชัน
TheSampler.OnTerminate := FFTBtnClick;
งานที่จะดำเนินการหลังจากการรวบรวมเสร็จสิ้น
TheSampler.FreeOnTerminate := จริง;
เลิกทำหลังจากรวบรวมเสร็จแล้ว
จบ;
----คำจำกัดความคลาสของเธรดการรวบรวมมีดังนี้:
พิมพ์
SampleThread = คลาส (TThread)
สาธารณะ
ฟังก์ชั่น AdRead (ach: ไบต์): จำนวนเต็ม safecall;
ฟังก์ชั่นอ่านการ์ด A/D
ขั้นตอน UpdateCaption;
แสดงเวลาการรวบรวม
ส่วนตัว
{ประกาศส่วนตัว}
ได้รับการคุ้มครอง
พวกเขา: จริง;
dt: จริง;
รหัส: จำนวนเต็ม;
เซนต์ เอ็ด: LongInt;
ขั้นตอนการดำเนินการแทนที่;
นี่คือกุญแจสำคัญ
จบ;
---- ในคลาสนี้ ฟังก์ชัน AdRead ถูกกำหนดไว้สำหรับการใช้งานการ์ด A/D และทั้งสองกระบวนการจะใช้เพื่อแสดงความคืบหน้าและเวลาในการรวบรวม ควรสังเกตว่าฟังก์ชัน AdRead ถูกเขียนในแอสเซมบลี และรูปแบบการเรียกพารามิเตอร์จะต้องเป็นการโทรที่ปลอดภัย
---- รหัสของวิธีการโอเวอร์โหลดคีย์ดำเนินการมีดังนี้:
ขั้นตอน SampleThread.Execute;
เริ่ม
StartTicker := GetTickCount;
รหัส := 0;
ทำซ้ำ
เหล่านี้ := Adread(15) * ad2mv * mv2l;
รับช่อง15
เทพ := Adread(3) * ad2mv * mv2n;
รับช่อง3
dt := GetTickCount - StartTicker;
sarray[id] := สิ่งเหล่านี้;
parray[id] := เทพ;
tarray[id] := dt;
Inc(รหัส);
ซิงโครไนซ์ (UpdateCaption);
หมายเหตุ: แสดงความคืบหน้าของการรวบรวม
จนถึงรหัส >=4096;
เอ็ด := GetTickCount;
ซิงโครไนซ์ (ShowCostTime);
หมายเหตุ: แสดงเวลาที่ใช้
จบ;
---- ดังที่เห็นได้จากโค้ดด้านบน ไม่มีความแตกต่างที่สำคัญระหว่าง Execute และโค้ดทั่วไป ข้อแตกต่างเพียงอย่างเดียวคือเมื่อแสดงความคืบหน้าของการรวบรวมและแสดงเวลาที่ผ่านไป ขั้นตอนที่เกี่ยวข้องไม่สามารถเรียกได้โดยตรง แต่โดยทางอ้อมโดยการเรียก Synchronize ทำเช่นนี้เพื่อรักษาการซิงโครไนซ์ระหว่างกระบวนการต่างๆ
---- 4. บทสรุป
---- โปรแกรมข้างต้นตั้งโปรแกรมโดยใช้ Delphi 4.0 และใช้งานบน AMD-K6-2/300 ผลการทดสอบมีดังนี้: การใช้มัลติเธรด โดยทั่วไปจะใช้เวลา 10 ถึง 14 วินาทีในการรวบรวม 4,096 คะแนน หากไม่ได้ใช้มัลติเธรด จะใช้เวลา 1 นาทีถึง 1 นาทีครึ่ง จะเห็นได้ว่ามัลติเธรดสามารถปรับปรุงประสิทธิภาพการทำงานของโปรแกรมได้อย่างมาก