Pemrograman multi-thread di bawah DELPHI (1)
Kita tahu bahwa win95 atau winNT keduanya adalah sistem operasi "multi-threaded". Di DELPHI 2.0, kita dapat memanfaatkan sepenuhnya fitur ini dan menulis aplikasi "multi-threaded".
Bagi mereka yang pernah menulis program di bawah DOS atau Windows 16-bit, "multi-threading" masih asing, tapi sama seperti kita bertransisi dari tugas tunggal di DOS ke multi-tasking di Windows 3.1, sekarang kita harus melakukan transisi lagi Bagaimanapun, ke bidang "multi-threading", era komputer terus berkembang. Namun, untungnya, pemrograman multi-thread di bawah DELPHI2.0 tidak mengharuskan kita mempelajari fungsi WIN32API yang besar. Kita dapat menggunakan kelas multi-thread standar TThread di bawah DELPHI untuk menyelesaikan pekerjaan kita.
TThread adalah kelas abstrak, artinya, tidak perlu mendeklarasikan variabel berdasarkan TThread (dan variabel yang dideklarasikan berdasarkan TThread sama sekali tidak berguna). bentuk warisan. Faktanya, sangat mudah untuk menulis aplikasi multi-thread berdasarkan TThread.
Berikut ini adalah kelas multi-utas dasar yang dihasilkan dengan mewarisi TThread.
Quer Ketiga. Pas
unitQuerThrd;
antarmuka
kegunaan
Kelas, Tabel DB;
jenis
TQueryThreadΚkelas(TTThread)
Pribadi
fQuery:tQuery;
terlindung
procedureExecute;override;
publik
konstruktorCreate(Ditangguhkan: Boolean; Kueri: TQuery);
akhir;
pelaksanaan
konstruktor
TQueryThread. Buat(Ditangguhkan: Boolean; Kueri: TQuery);
mulai
warisanBuat(Ditangguhkan);
fQuery: ΚQuery;
GratisDiTerminate:ΚBenar;
akhir;
prosedurTQueryThread. Menjalankan;
mulai
fQuery. Membuka;
akhir;
akhir.
Dalam contoh sederhana di atas, kami membuat subkelas TQuery-Thread dari TThread untuk mengeksekusi kueri database di latar belakang. Dalam fungsi Buat kelas ini, dua parameter Suspended dan Query diteruskan, di mana Suspended digunakan untuk mengontrol jalannya thread. Jika Suspend benar, thread kelas TQueryThread akan ditangguhkan segera setelah dibuat hingga Resume. metode dijalankan. Thread akan terus dieksekusi. Parameter Query digunakan untuk menerima kontrol Query yang ada (kontrol Query sebenarnya dalam formulir) untuk membuatnya berjalan dalam situasi multi-thread. Eksekusi adalah proses yang paling penting. Ini adalah bagian eksekusi dari kelas TQueryThread. Semua pernyataan yang perlu dijalankan di kelas multi-thread ini harus ditulis dalam proses ini.
Faktanya, ketika membangun kelas multi-thread Anda sendiri, Anda tidak perlu memasukkan semua kode ini. Pilih opsi baru di bawah menu File DELPHI, lalu pilih proyek "TThreadObject", dan DELPHI akan membuat modul program dasar untuk Anda. Kemudian kita dapat melakukan modifikasi sesuai kebutuhan.
Eksekusi proses:
Misalkan kita telah membuat formulir FORM1, yang berisi kontrol kueri Query1 yang akan kita gunakan. Kemudian kita tambahkan unit QuerThrd yang tertulis di atas ke bagian USES unit tersebut.
prosedurTForm1. Button1Click(Pengirim: TObject);
mulai
{Buat proses yang berjalan}
TQueryThread. Buat(Salah,Kueri1);
akhir;
Jika proses ini dijalankan, kontrol kueri Query1 dalam formulir akan secara otomatis menjalankan kueri di lingkungan multi-utas. Perhatikan bahwa hanya ada Buat tetapi tidak Gratis di kelas TQueryThread. Setelah membuat kelas secara dinamis dan kemudian lupa menghapusnya, ini adalah salah satu kesalahan yang sering kami lakukan, namun karena kami telah menetapkan FreeOnTerminate (hapus setelah dijalankan) sebagai benar di sini, ketika pernyataan di Execute dijalankan Setelah selesai, kontrol memori yang ditempati oleh kelas TQueryThread akan dilepaskan secara otomatis.
Namun, ada masalah lain yang perlu kita perhatikan. Karena beberapa thread dapat berjalan secara bersamaan, kita juga harus menyelesaikan masalah sinkronisasi. Jika tidak ada korelasi antara beberapa program multi-thread, maka tidak akan ada korelasi di antara keduanya. konflik apa pun. Namun kenyataannya, beberapa aplikasi database multi-thread mungkin berjalan pada waktu yang sama. Karena sumber daya database yang sama perlu dibagikan, kita juga perlu menambahkan kontrol Tsession ke Query1.
Faktanya, meskipun kami mungkin tidak menggunakan kontrol Sesi secara pribadi, pada kenyataannya, DELPHI akan secara otomatis membuat kontrol Sesi sementara selama semua akses database, dan secara dinamis menghapusnya setelah digunakan. Dalam pemrograman database normal, kita tidak perlu melakukannya sendiri, tetapi dalam kasus eksekusi database multi-thread, agar tidak bertentangan satu sama lain, kita harus menyesuaikan kontrol Sesi kita sendiri untuk setiap akses database. Langkah ini sangat sederhana. Kita hanya perlu menambahkan kontrol Sesi ke formulir, lalu menulis nama arbitrer ke propertinya "Nama Sesi", dan kemudian menulis nama yang sama di "Nama Sesi" di Query1. Dengan cara ini program database kami aman.
Jenis masalah sinkronisasi lain yang perlu diselesaikan adalah program-program yang beroperasi pada sumber daya VCL. Ada banyak program seperti itu, namun untungnya solusinya juga sangat sederhana.
Kita bisa melihat program seperti ini:
unitBncThrd;
antarmuka
kegunaan
WinProcs, Kelas, Grafik, ExtCtrls;
jenis
TBBounceThreadΚkelas(TTThread)
pribadi
Bentuk F: Bentuk T;
FXSpeed: Bilangan Bulat;
Kecepatan FY: Bilangan Bulat;
prosedurPindahkanBentuk;
terlindung
procedureExecute;override;
publik
konstruktorCreate(Ditangguhkan: Boolean; Bentuk: TShape; XSpeed, YSpeed: Integer);
propertyShape: TShaperreadFShape;
akhir;
pelaksanaan
prosedurTBouad. PindahkanBentuk;
var
MaxHeight, MaxWidth: Integer;
mulai
denganFShapedo
mulai
Kiri: ΚKiri+FXSpeed;
Atas: ΚAtas+FYSpeed;
jika(KiriΙ0)atau
(Kiri+LebarΛOrang Tua.Lebar)lalu
Kecepatan FX: Kecepatan FX*-1;
jika(AtasΙ0)atau
(Atas+TinggiΛPaent.Tinggi)lalu
Kecepatan FY: Kecepatan FY*-1;
Blog Penulis: http://blog.csdn.net/zou5655/