Kelas utas di Delphi
Raptor[Studio Mental]
http://mental.mentu.com
(satu)
Ada kelas thread TThread di Delphi yang digunakan untuk mengimplementasikan pemrograman multi-thread. Kebanyakan buku Delphi menyebutkan hal ini, tetapi pada dasarnya mereka memberikan pengenalan singkat kepada beberapa anggota kelas TThread, dan kemudian menjelaskan fungsi Execute Sinkronisasi selesai. Namun, ini tidak semuanya tentang pemrograman multi-thread. Tujuan penulisan artikel ini adalah untuk melengkapinya.
Thread pada dasarnya adalah sepotong kode yang berjalan secara bersamaan dalam suatu proses. Suatu proses memiliki setidaknya satu thread, yang disebut thread utama. Bisa juga ada beberapa sub-utas sekaligus. Ketika lebih dari satu thread digunakan dalam suatu proses, ini disebut "multithreading".
Jadi, bagaimana apa yang disebut "sepotong kode" ini didefinisikan? Sebenarnya, ini adalah fungsi atau proses (untuk Delphi).
Jika Anda menggunakan Windows API untuk membuat thread, hal ini diimplementasikan melalui fungsi API yang disebut CreateThread, yang didefinisikan sebagai:
MENANGANI Buat Thread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWord dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
Parameternya sesuai dengan namanya: atribut thread (digunakan untuk menyetel atribut keamanan thread di bawah NT, tidak valid di bawah 9X), ukuran tumpukan, alamat awal, parameter, bendera pembuatan (digunakan untuk menyetel status thread saat dibuat), ID thread, dan akhirnya mengembalikan thread Handle. Alamat awal adalah pintu masuk ke fungsi thread. Sampai fungsi thread berakhir, thread berakhir.
Proses eksekusi seluruh thread adalah sebagai berikut:
Karena CreateThread memiliki banyak parameter dan merupakan Windows API, fungsi thread umum disediakan di C Runtime Library (secara teoritis dapat digunakan di OS apa pun yang mendukung thread):
unsigned long _beginthread(void (_USERENTRY *__start)(void *), unsigned __stksize, void *__arg);
Delphi juga menyediakan fungsi serupa dengan fungsi yang sama:
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord; ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord; var ThreadId: LongWord): Integer;
Fungsi dari ketiga fungsi ini pada dasarnya sama. Semuanya memasukkan kode ke dalam fungsi thread ke dalam thread independen untuk dieksekusi. Perbedaan terbesar antara fungsi thread dan fungsi umum adalah segera setelah fungsi thread dimulai, ketiga fungsi startup thread kembali. Thread utama terus dijalankan ke bawah, sedangkan fungsi thread dijalankan dalam thread independen ambil untuk dieksekusi? Ketika kembali, utas utama tidak peduli dan tidak tahu.
Dalam keadaan normal, setelah fungsi thread kembali, thread dihentikan. Namun ada cara lain:
API Windows:
VOID ExitThread(DWORD dwExitCode);
Perpustakaan Waktu Proses C:
batal _endthread(batal);
Perpustakaan Waktu Proses Delphi:
Prosedur EndThread (Kode Keluar: Integer);
Untuk mencatat beberapa data thread yang diperlukan (status/properti, dll.), OS akan membuat Objek internal untuk thread tersebut. Misalnya, di Windows, Pegangannya adalah Pegangan dari Objek internal ini, jadi Objek ini harus dilepaskan ketika benang itu berakhir.
Meskipun pemrograman multi-thread dapat dengan mudah dilakukan menggunakan API atau RTL (Runtime Library), pemrosesan yang lebih detail masih diperlukan Untuk alasan ini, Delphi telah membuat enkapsulasi thread yang lebih baik di unit Kelas. Ini adalah kelas thread VCL: TThread
Menggunakan kelas ini juga sangat sederhana. Kebanyakan buku Delphi mengatakan bahwa penggunaan dasarnya adalah: pertama-tama turunkan kelas thread Anda sendiri dari TThread (karena TThread adalah kelas abstrak dan tidak dapat menghasilkan instance), lalu gunakan metode abstrak Override: Execute( This adalah fungsi thread, yang merupakan bagian dari kode yang dieksekusi di thread). Jika Anda perlu menggunakan objek visual VCL, Anda perlu melakukannya melalui proses Sinkronisasi. Untuk detail spesifiknya, kami tidak akan membahas detailnya di sini.
Hal berikutnya yang akan dibahas dalam artikel ini adalah bagaimana kelas TThread merangkum thread, yaitu studi mendalam tentang implementasi kelas TThread. Karena hanya dengan benar-benar memahaminya kita bisa memanfaatkannya dengan lebih baik.
Berikut deklarasi kelas TThread pada DELPHI7 (artikel ini hanya membahas implementasi pada platform Windows, sehingga semua kode yang terkait dengan platform Linux telah dihapus):
TThread = kelas
pribadi
Pegangan F: Pegangan;
FThreadID: Pegangan;
FCreateSuspended: Boolean;
Dihentikan: Boolean;
FDitangguhkan: Boolean;
FFreeOnTerminate: Boolean;
Selesai: Boolean;
FReturnValue: Integer;
FOnTerminate: TNotifyEvent;
Sinkronisasi F: TSynchronizeRecord;
FFatalException: TObject;
prosedur CallOnTerminate;
prosedur kelas Sinkronisasi(ASyncRec: PSynchronizeRecord);
fungsi DapatkanPrioritas: TThreadPriority;
prosedur SetPriority(Nilai: TThreadPriority);
prosedur SetSuspended (Nilai: Boolean);
terlindung
prosedur CheckThreadError(ErrCode: Integer kelebihan beban);
prosedur CheckThreadError(Sukses: Boolean kelebihan beban;
prosedur DoTerminate;
prosedur Jalankan; virtual;
prosedur Sinkronisasi (Metode: TThreadMethod kelebihan beban;
properti ReturnValue: Integer baca FReturnValue tulis FReturnValue;
properti Dihentikan: Boolean dibaca FTerminated;
publik
konstruktor Buat(CreateSuspended: Boolean);
destruktor Hancurkan;
prosedur Setelah Konstruksi;
prosedur Lanjutkan;
prosedur menangguhkan;
prosedur Mengakhiri;
fungsi Tunggu: LongWord;
prosedur kelas Sinkronisasi(AThread: TThread; Metode: TThreadMethod kelebihan beban;
prosedur kelas StaticSynchronize(AThread: TThread; AMethod: TThreadMethod);
properti FatalException: TObject membaca FFatalException;
properti FreeOnTerminate: Boolean baca FFreeOnTerminate tulis FFreeOnTerminate;
properti Menangani: THandle membaca FHandle;
Prioritas properti: TThreadPriority baca GetPriority tulis SetPriority;
properti Ditangguhkan: Boolean baca FSuspended tulis SetSuspended;
properti ThreadID: THandle membaca FThreadID;
properti OnTerminate: TNotifyEvent baca FOnTerminate tulis FOnTerminate;
akhir;
Kelas TThread adalah kelas yang relatif sederhana di RTL Delphi. Tidak banyak anggota kelas dan atribut kelasnya sangat sederhana dan jelas. Artikel ini hanya akan melakukan analisis rinci tentang beberapa metode anggota kelas yang lebih penting dan satu-satunya acara: OnTerminate .
(bersambung)