2010-11-17 6 views
8

trong Delphi XE tôi có thể sử dụng thủ tục bắt đầu, nhưng phương pháp này không tồn tại trong delphi 2007.Đó là cách chính xác để bắt đầu một sợi bị treo trong delphi 2007?

mẫu này đang làm việc ok trong delphi xe, sử dụng Bắt đầu

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Start; 

nhưng trong delphi 2007, start thủ tục không tồn tại, vì vậy tôi đang sử dụng thủ tục tiếp tục không được chấp nhận trong các phiên bản mới của delphi.

MyThread:=TMyThread.Create(True); 
MyThread.FreeOnTerminate :=True; 
MyThread.Property1:=900; 
MyThread.Property2:=2; 
MyThread.Resume; 

vì vậy quieon là, Sử dụng ok là resume trong delphi 2007 hoặc tôi phải sử dụng cách khác để bắt đầu chuỗi bị treo?

Xin cảm ơn trước.

Trả lời

19

Các cách chính xác để bắt đầu một thread bị đình chỉ là không bao giờ có một sợi lơ lửng ở nơi đầu tiên.

Có cách tốt hơn để tạo chuỗi. Nếu người gọi phải cung cấp giá trị cho đối tượng để lớp đó hoạt động chính xác, thì đừng đặt tùy chọn: Yêu cầu nó làm tham số cho hàm tạo. Và nếu chỉ có một giá trị hợp lệ cho tham số đó, thì thậm chí không làm cho nó trở thành một tham số: Chỉ cần mã hóa nó trong hàm tạo. (? Đã bao nhiêu lần bạn viết một lớp sợi mà chỉ đôi khi nên giải phóng bản thân về việc chấm dứt Tôi chưa bao giờ thấy.)

constructor TMyThread.Create(Prop1, Prop2: Integer); 
begin 
    inherited Create(False); 
    FreeOnTerminate := True; 
    Property1 := Prop1; 
    Property2 := Prop2; 
end; 

Sau đó, bạn có thể sử dụng phương pháp Ron Popeil của chủ đề tạo: Just Chấp nhận nó và quên nó đi!

MyThread := TMyThread.Create(900, 2); 

Người gọi không phải làm bất kỳ điều gì với chuỗi sau khi tạo. Và vì đó là một chuỗi miễn phí-chấm dứt, có thể là người gọi thậm chí không nên giữ tham chiếu đến biến số MyThread vì tham chiếu sẽ trở thành không hợp lệ ngay sau khi chuỗi kết thúc chạy.

(Lo lắng về điều đó inherited Create(False) dòng tạo ra một chuỗi sẽ bắt đầu chạy trước khi phần còn lại của hàm tạo kết thúc chạy? Không được! Đó là cố định trong Delphi 6, hơn một thập kỷ trước. sau khi hàm tạo xong, xem TThread.AfterConstruction để xem cách thực hiện.)

+1

+ Inf cho đoạn cuối – arthurprs

+0

Cảm ơn bạn đã thêm thông tin về thứ tự tạo và thực thi. Tôi đã luôn luôn bắt đầu chủ đề bị đình chỉ và tiếp tục chúng với nỗi sợ hãi chính xác này. –

1

Vâng, đó là cách chính xác cho các phiên bản Delphi cũ hơn không có thủ tục Start.

1

Tiếp tục và tạm ngưng không được dùng nữa trong phiên bản Delphi 2010 và phiên bản mới hơn. Dường như nó là cơ bản để ngăn cản sử dụng chúng cho đồng bộ hóa thread. Họ không có ý đó.

Dù sao, nếu tất cả những gì bạn muốn làm là tiếp tục một chuỗi đã tạo bị tạm ngưng, sau đó gọi lại Tiếp tục trong phiên bản cũ là an toàn.

Nếu bạn cần sử dụng cùng một mã nguồn trong cả hai Delphi 2007 và Delphi XE, thì bạn có thể sử dụng biên dịch có điều kiện để tránh cảnh báo trong XE.

Ngoài ra, hãy nhìn vào câu hỏi này có liên quan đến câu hỏi của bạn:

TThread.resume is deprecated in Delphi-2010 what should be used in place?

0

Bạn không bao giờ nên tạm ngưng cuộc gọi nếu không an toàn để làm như vậy và tiếp tục chỉ nên được sử dụng để bắt đầu một chuỗi đã được tạo.

Trong Delphi 2010, việc tạm ngưng và tiếp tục bị khấu hao và phương pháp bắt đầu được giới thiệu để củng cố điều này.

Để được giải thích đầy đủ hơn, hãy xem điều này thread tại diễn đàn Codegears.

5

Không có gì sai khi gọi Resume trên một chuỗi được tạo với tham số CreateSuspended được đặt thành true trong hàm tạo. (Tại sao lại có một tham số CreateSuspended sau khi tất cả?)

Tuy nhiên, sự cố thực sự xảy ra khi bạn tạm dừng/tiếp tục chủ đề đang chạy. Chủ yếu là do tham chiếu đến tài nguyên mở, chẳng hạn như đối tượng COM. (Ví dụ, nếu bạn có một đối tượng kết nối ADO đang hoạt động, và một truy vấn đang chạy ... nó không phải là rất lý tưởng để đình chỉ chuỗi đó và cố gắng tiếp tục nó sau đó ... rõ ràng là không phải lúc nào cũng hoạt động tốt cho bạn hoặc Kết nối cơ sở dữ liệu trong trường hợp đó.)

Nếu bạn cẩn thận với các tham chiếu bên ngoài, thì việc tạm dừng/tiếp tục chuỗi đang chạy trở nên an toàn hơn nhiều, ngoại trừ các điều kiện chủng tộc có thể có ... nhiều câu hỏi khác ...

+0

Hoặc nói chung, bất kỳ trường hợp nào khi bạn gửi một số loại yêu cầu và đang chờ một số loại phản hồi. –