Teknologi akuisisi data memainkan peran penting dalam pengendalian dan otomasi industri serta bidang lainnya. Proses umum pengumpulan data adalah sebagai berikut:
①Kirim perintah pemilihan saluran ke kartu pengambilan. ②Pilih nomor saluran yang akan dikumpulkan. ③Mulai konversi A/D. ④Tunggu hingga konversi selesai. ⑤Baca data dari kartu akuisisi. Untuk akuisisi multi-saluran, dua metode umumnya digunakan dalam desain program. Metode kueri atau metode interupsi. Yang disebut metode kueri adalah menggunakan loop untuk mengumpulkan setiap saluran data secara berurutan. Keuntungan dari metode query adalah programnya sederhana dan mudah diimplementasikan; kelemahannya adalah selama proses pengumpulan, CPU menghabiskan sebagian besar waktunya untuk menunggu, sehingga mengakibatkan pemborosan sumber daya. Metode interupsi mengadopsi bentuk interupsi perangkat keras - pertama memulai konversi A/D, dan mengirimkan sinyal interupsi di akhir konversi - CPU membacakan data yang dikumpulkan ketika merespons interupsi data akuisisi. Dengan cara ini, sambil menunggu konversi, CPU dapat melakukan perhitungan lain tanpa harus menunggu. Keuntungan dari metode interupsi adalah bahwa sumber daya dapat dimanfaatkan sepenuhnya; namun, desain programnya rumit, terutama ketika sumber daya interupsi perangkat keras sistem terbatas, dan mudah menyebabkan konflik interupsi; Win95, pengguna tidak diperbolehkan untuk menginstal waktu penangan interupsi, hal itu tidak dapat dicapai.
---- Kedua metode yang dibahas di atas adalah kedua metode di bawah DOS di bawah Win95, sekarang ada metode yang lebih baik - teknologi multi-threading. Kini, kita bisa memanfaatkan teknologi multi-threading untuk pengumpulan data.
---- 1. Keuntungan menggunakan multi-threading untuk pengumpulan data
---- Hal paling populer tentang Win95/98, selain antarmukanya yang cantik, adalah multi-threading dan multi-tasking. Di lingkungan DOS, program pelaksana dapat memonopoli semua sumber daya; di lingkungan Windows, meskipun ini merupakan lingkungan multitasking yang belum sempurna, program Anda masih dapat mengontrol seluruh waktu CPU selama Anda mau. Namun, di Windows95 dan Windows NT, suatu program tidak dapat memonopoli seluruh waktu eksekusi CPU. Apalagi suatu program tidak satu baris dari awal hingga akhir. Sebaliknya, suatu program dapat dibagi menjadi beberapa bagian program selama eksekusi dan dijalankan secara bersamaan. Fragmen program yang dapat dijalankan secara bersamaan disebut thread. Pada Windows 95 dan Windows NT, sistem operasi dapat menjalankan beberapa program secara bersamaan secara bergantian, yaitu multitasking.
---- Menggunakan multi-threading untuk pengumpulan data dapat secara efektif mempercepat kecepatan respons program dan meningkatkan efisiensi eksekusi. Program umum harus memproses masukan pengguna, tetapi dibandingkan dengan kecepatan eksekusi CPU, kecepatan masukan pengguna seperti berjalan atau terbang. Dengan cara ini, CPU akan membuang banyak waktu menunggu masukan pengguna (seperti di lingkungan DOS). Jika multi-threading digunakan, satu thread dapat digunakan untuk menunggu input pengguna; thread lainnya dapat melakukan pemrosesan data atau pekerjaan lainnya. Untuk program pengumpulan data, thread terpisah dapat digunakan untuk pengumpulan data. Dengan cara ini, sifat pengumpulan real-time dapat dijamin semaksimal mungkin, sementara thread lain dapat merespons operasi pengguna atau melakukan pemrosesan data secara tepat waktu. Jika tidak, program tidak dapat merespons operasi pengguna saat mengumpulkan data; program tidak dapat mengumpulkan data saat merespons operasi pengguna; Terutama ketika jumlah data yang dikumpulkan besar dan tugas pemrosesan data berat, waktu tunggu yang lama selama pengumpulan sangat dapat diterima jika multi-threading tidak digunakan.
---- Namun, multithreading jauh lebih kompleks daripada pemrograman biasa. Karena beberapa thread dapat dijalankan pada waktu yang sama kapan saja, banyak variabel dan data dapat diubah oleh thread lain. Ini adalah masalah kontrol sinkronisasi paling kritis antar thread dalam program multi-thread.
---- 2. Masalah yang harus diselesaikan dengan multi-threading untuk pengumpulan data
---- Faktanya, kompleksitas pemrograman multi-thread bersifat sementara; jika Anda menggunakan C tradisional untuk desain multi-thread, maka Anda harus mengontrol sendiri sinkronisasi antar thread. Itu akan menjadi rumit. Namun, jika Anda menggunakan metode desain berorientasi objek dan menggunakan Delphi untuk pemrograman multi-thread, masalahnya akan lebih sederhana. Hal ini karena Delphi telah menangani kompleksitas multi-threading untuk kita, dan yang harus kita lakukan hanyalah mewarisi.
---- Secara khusus, pengumpulan data multi-utas perlu menyelesaikan pekerjaan berikut:
---- ① Turunkan SampleThread kelas Anda sendiri dari kelas TThread. Ini adalah kelas yang kami gunakan untuk pengumpulan data. Saat mengumpulkan, cukup buat instance SampleThread.
---- ② Membebani metode Execute dari TThread kelas super. Dalam metode ini, tugas pengumpulan data akan dilakukan secara khusus.
---- ③ Jika Anda ingin mengumpulkan dan menampilkan pada saat yang sama, tulis beberapa proses untuk menampilkan kemajuan pengumpulan untuk memanggil metode Execute.
---- Atribut/metode yang paling umum digunakan di kelas TThread adalah sebagai berikut:
Metode pembuatan: konstruktor Buat
(BuatDitangguhkan: Boolean);
----Parameter CreateSuspended menentukan apakah thread akan segera dieksekusi saat dibuat. Jika Benar, thread baru akan ditangguhkan setelah pembuatan; jika Salah, thread akan dieksekusi segera setelah pembuatan.
Properti FreeOnTerminate:
Properti GratisOnTerminate: Boolean;
---- Atribut ini menentukan apakah programmer bertanggung jawab untuk membatalkan thread ini. Jika properti ini Benar, VCL akan secara otomatis menghancurkan objek thread ketika thread dihentikan. Nilai defaultnya adalah False.
Properti OnTerminate:
properti OnTerminate: TNotifyEvent;
---- Atribut ini menentukan peristiwa yang terjadi ketika thread berakhir.
---- Mari kita lihat contoh spesifiknya:
---- 3. Implementasi pengumpulan data multi-thread
---- Ini adalah program yang dikembangkan oleh penulis untuk mengukur diagram kinerja suatu unit pompa. Fungsinya untuk mengumpulkan data beban dan perpindahan titik suspensi unit pompa, kemudian membuat diagram kerja unit pompa setelah diolah. Gambar 1 (dihilangkan) menunjukkan antarmuka selama pengumpulan data. Setelah mengklik tombol "Kumpulkan Data", program akan membuat thread baru dan mengatur propertinya. Thread baru ini akan menyelesaikan tugas pengumpulan data. Prosedurnya adalah sebagai berikut:
ProsedurTsampleForm.
DoSampleBtnClick(Pengirim: TObject);
Mulai
ReDrawBtn.Enabled := Benar;
DoSampleBtn.Enabled := Salah;
FFTBtn.Diaktifkan := Benar;
TheSampler := SampleThread.Create(False);
Buat utas koleksi
TheSampler.OnTerminate := FFTBtnKlik;
Tugas yang harus dilakukan setelah pengumpulan selesai
TheSampler.FreeOnTerminate := Benar;
Urungkan setelah pengumpulan selesai
Akhir;
---- Definisi kelas dari thread koleksi adalah sebagai berikut:
Jenis
SampleThread = kelas(TTthread)
Publik
fungsi AdRead(ach: byte): integer;
Berfungsi untuk membaca kartu A/D
prosedur PembaruanCaption;
Tampilkan waktu pengumpulan
pribadi
{Deklarasi pribadi}
terlindung
ini, itu: nyata;
dt: nyata;
id: bilangan bulat;
st, ed: PanjangInt;
prosedur Jalankan;
Inilah kuncinya.
Akhir;
---- Di kelas ini, fungsi AdRead didefinisikan untuk mengoperasikan kartu A/D, dan kedua proses tersebut digunakan untuk menampilkan kemajuan dan waktu pengumpulan. Perlu dicatat bahwa fungsi AdRead ditulis dalam perakitan, dan format pemanggilan parameter harus safecall.
----Kode metode Execute yang kelebihan beban kunci adalah sebagai berikut:
Prosedur SampleThread.Execute;
Mulai
MulaiTicker := DapatkanTickCount;
nomor identitas := 0;
Mengulang
ini := Adread(15) * ad2mv * mv2l;
Dapatkan saluran 15
itu := Adread(3) * ad2mv * mv2n;
Dapatkan saluran 3
dt := GetTickCount - MulaiTicker;
sarray[id] := ini;
parray[id] := itu;
tarray[id] := dt;
inc(id);
Sinkronisasi(UpdateCaption);
Catatan: Tampilkan kemajuan pengumpulan
Sampai id >=4096;
ed := DapatkanTickCount;
Sinkronisasi (ShowCostTime);
Catatan: Tunjukkan waktu yang dihabiskan
akhir;
---- Seperti yang terlihat dari kode di atas, tidak ada perbedaan mendasar antara kode Execute dan kode biasa. Satu-satunya perbedaan adalah ketika menampilkan kemajuan pengumpulan dan menampilkan waktu yang telah berlalu, masing-masing prosedur tidak dapat dipanggil secara langsung, tetapi secara tidak langsung dengan memanggil Sinkronisasi. Hal ini dilakukan untuk menjaga sinkronisasi antar proses.
---- 4. Kesimpulan
----Program di atas diprogram menggunakan Delphi 4.0 dan diimplementasikan pada AMD-K6-2/300. Hasil pengujiannya adalah sebagai berikut: menggunakan multi-threading, biasanya diperlukan waktu 10 hingga 14 detik untuk mengumpulkan 4096 poin; jika tidak menggunakan multi-threading, diperlukan waktu 1 menit hingga 1 setengah menit. Terlihat bahwa multi-threading dapat meningkatkan efisiensi eksekusi program secara signifikan.