Tôi có một chương trình Delphi đơn giản mà tôi đang làm việc, trong đó tôi đang cố gắng sử dụng luồng để tách chức năng của chương trình khỏi giao diện đồ họa của nó, và giữ giao diện GUI trong thời gian dài hơn nhiệm vụ, vv Về cơ bản, tôi có một 'điều khiển' TThread, và một 'xem' TForm. Khung nhìn biết xử lý của bộ điều khiển, mà nó sử dụng để gửi thông báo điều khiển qua PostThreadMessage
. Tôi đã không có vấn đề gì trong quá khứ bằng cách sử dụng loại mô hình này cho các biểu mẫu không phải là biểu mẫu chính, nhưng vì một số lý do, khi tôi cố gắng sử dụng mô hình này cho biểu mẫu chính, vòng lặp thông điệp của chuỗi chỉ thoát.Thông điệp chủ đề Vòng treo trong Delphi
Đây là mã của tôi cho các vòng lặp đề thông điệp:
procedure TController.Execute;
var
Msg : TMsg;
begin
while not Terminated do begin
if (Integer(GetMessage(Msg, hwnd(0), 0, 0)) = -1) then begin
Synchronize(Terminate);
end;
TranslateMessage(Msg);
DispatchMessage(Msg);
case Msg.message of
// ...call different methods based on message
end;
end;
end;
Để thiết lập bộ điều khiển, tôi làm điều này:
Controller := TController.Create(true); // Create suspended
Controller.FreeOnTerminate := True;
Controller.Resume;
Đối xử lý tin nhắn dạng chính, tôi đã cố gắng sử dụng cả Application.Run
và vòng lặp sau (ngay sau Controller.Resume
)
while not Application.Terminated do begin
Application.ProcessMessages;
end;
Tôi đã chạy bị kẹt ở đây - mọi trợ giúp sẽ được đánh giá cao.
Chào mừng bạn đến với Stack Overflow, erikjw! Tôi hy vọng bạn tìm thấy một câu trả lời tốt. Ghi chú nhanh, mặc dù. Nó làm cho mã của bạn khó đọc hơn khi bạn đặt một 'bắt đầu' trên cùng một dòng với' do' hoặc 'then' trước nó. Đó được coi là phong cách tốt trong C, nhưng trong Delphi hầu hết chúng ta thích đặt nó trên dòng riêng của mình vì vậy chúng tôi có thể xếp hàng 'bắt đầu' và' kết' cặp trực quan. –
Cảm ơn tất cả các câu trả lời cho đến nay. Tôi đã thử từng cách riêng biệt, cũng như một số kết hợp khác nhau và tôi vẫn gặp sự cố. Khi tôi thực hiện một debug, và bước qua đoạn mã trong 'TController.Execute', ngay khi tôi bước qua' GetMessage', cho dù tôi truyền cái gì đi nữa, nó không liên tục đi qua vòng lặp. Nó không thực thi bất kỳ câu lệnh nào sau vòng lặp, nó chỉ dừng lại một cách không giải thích được. Và điều thậm chí còn khó hiểu hơn là tôi không thấy dấu hiệu nào cho thấy chính sợi chỉ đã chết. –
Bạn đã thử xóa 'Synchronize()' chưa? Nếu không có vòng lặp tin nhắn nào chạy, nó có thể bị lỗi. Ngoài ra, bạn đang sử dụng phiên bản Delphi nào? – Nat