2008-09-30 22 views

Trả lời

19

Phiên bản mới nhất của Delphi, Delphi 2009, có thuộc tính lớp CurrentThread trên lớp TThread.

Điều này sẽ trả về đối tượng chuỗi Delphi thích hợp nếu đó là một chuỗi gốc. Nếu chuỗi là một chuỗi "người ngoài hành tinh", tức là được tạo bằng cách sử dụng một số cơ chế khác hoặc trên một cuộc gọi lại từ một chuỗi của bên thứ ba, thì nó sẽ tạo một chuỗi bao bọc xung quanh xử lý luồng.

+0

Thật không may, CurrentThread có một lỗ hổng nghiêm trọng khiến nó vô dụng: http://stackoverflow.com/questions/188281/delphi-tthread- currentthread-and-eaccessviolation-is-this-a-bug-hoặc-my-incompete – Roddy

+4

@Roddy và cho người đọc trong tương lai: đã được khắc phục bằng bản vá vào năm 2009 và được khắc phục trong bản phát hành năm 2010. –

+1

@DavidM - Cảm ơn - vâng, đã được sửa trong D2010. D2009 yêu cầu bản vá (không chính thức) được liên kết từ câu hỏi khác - không có bản cập nhật chính thức nào của D2009 giải quyết vấn đề này. – Roddy

0

Trả lời câu hỏi của riêng tôi. Tôi đoán không thể lấy đối tượng TThread từ ID. Có thể bằng cách sử dụng một biến toàn cầu. Sau đó so sánh xử lý của nó và id luồng hiện tại, người ta có thể xác định xem có đang chạy trong luồng chính hay không.

+0

Delphi 2009, ít nhất, có thuộc tính TThread.CurrentThread. –

0

Chuỗi hiện tại không phải là chuỗi bạn đang cố chạy hàm?

0

Bạn có thể lưu trữ các con trỏ của instance TThread trong bối cảnh các thread hiện hành thông qua TlsSetValue gọi API và sau đó lấy nó bằng cách sử TlsGetValue. Tuy nhiên, lưu ý rằng điều này sẽ chỉ hoạt động nếu bạn đang cố truy xuất/lưu trữ phiên bản TThread của chuỗi hiện tại.

19

Từ câu trả lời của riêng bạn, có vẻ như có thể bạn chỉ muốn "xác định nếu chạy trong thread chính hay không", trong trường hợp này bạn chỉ có thể sử dụng

if Windows.GetCurrentThreadId() = System.MainThreadID then 
// ... 

Mặc dù điều này sẽ không làm việc từ một DLL được tạo bằng Delphi nếu nó được tải bởi một chuỗi công nhân.

4

Tôi đang sử dụng dòng dõi TThread của riêng mình để đăng ký chính nó trong danh sách chung, được bảo vệ bằng khóa.

Bằng cách đó, một phương pháp trong hậu duệ này có thể đi bộ trong danh sách và nhận được một TThread cung cấp một ID.

Các vấn đề liên quan