Tôi muốn một hàm như GetCurrentThread trả về đối tượng TThread của chuỗi thực thi hiện tại. Tôi biết có một Win32 API gọi GetCurrentThread, nhưng nó trả về Id chủ đề. Nếu có khả năng nhận đối tượng TThread từ ID đó cũng tốt.Nhận đối tượng TThread cho chuỗi đang thực hiện?
Trả lời
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.
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.
Delphi 2009, ít nhất, có thuộc tính TThread.CurrentThread. –
Chuỗi hiện tại không phải là chuỗi bạn đang cố chạy hàm?
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.
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.
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.
- 1. Ruby - nhận tệp đang được thực hiện
- 2. Đối tượng hiện đang được sử dụng ở nơi khác
- 3. Nhận PID của ứng dụng hiện đang được thực hiện
- 4. NSInvocation: đối tượng không thực hiện methodSignatureForSelector
- 5. Đối tượng Newtonsoft → Nhận chuỗi JSON
- 6. Khám phá các đối tượng khác khi đang thực hiện TDD
- 7. WIN32: Thực hiện thực hiện cho một chuỗi khác (đã cho)
- 8. Ninject: Thực hiện WithConstructorArgument (tên chuỗi, Func <IContext, đối tượng> gọi lại)
- 9. ajax đang sản xuất [đối tượng đối tượng]?
- 10. Thực hiện tham chiếu đối tượng khung thực thể như nhau cho cùng một đối tượng cơ sở dữ liệu
- 11. HOG cho "đối tượng phát hiện" opencv
- 12. Đối tượng Javascript nhận được mã như chuỗi
- 13. Thực hiện tuần tự hóa đối tượng thực tế?
- 14. Nên một đối tượng thực hiện một iterator hoặc chứa một đối tượng thực hiện một iterator
- 15. Nhận tên lược đồ của thủ tục hiện đang thực hiện lưu trữ
- 16. Thực hiện JavaScript SHA1 cho chuỗi lớn
- 17. Nhận hiện tại onClickListener của đối tượng Android View
- 18. Android - chuyển đổi chuỗi chứng chỉ pkcs12 thành đối tượng chứng nhận x509 cho bks keystore
- 19. Ít nhất một đối tượng phải thực hiện IComparable
- 20. Obj-C đối tượng đệm tròn, thực hiện một?
- 21. Truyền vs Chuyển đổi đối tượng thànhString, khi đối tượng thực sự là một chuỗi
- 22. Đang tải đối tượng Hibernate javassist-ed Hibernate
- 23. Nhận loại thực tế của thông số đối tượng chung
- 24. Cách kiểm tra xem đối tượng đã cho là đối tượng hoặc Mảng trong chuỗi JSON
- 25. "Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng" Đang cố gắng thêm vào danh sách
- 26. Xuất hiện ký tự trong một đối tượng chuỗi C
- 27. Thực hiện chuyển đổi cho các đối tượng với Java Generics
- 28. Xác thực đối tượng PHP
- 29. Thực hiện IXmlSerializable trên một đối tượng bộ sưu tập
- 30. Nhận giá trị chuỗi từ đối tượng Json Android
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
@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. –
@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