Trong Dephi, tôi tạo ra một chủ đề, như thế này, mà sẽ gửi thông điệp tới hình thức chính trong từng thời kỳGửi chuỗi dữ liệu từ chủ đề đến hình thức chính
Procedure TMyThread.SendLog(I: Integer);
Var
Log: array[0..255] of Char;
Begin
strcopy(@Log,PChar('Log: current stag is ' + IntToStr(I)));
PostMessage(Form1.Handle,WM_UPDATEDATA,Integer(PChar(@Log)),0);
End;
procedure TMyThread.Execute;
var
I: Integer;
begin
for I := 0 to 1024 * 65536 do
begin
if (I mod 65536) == 0 then
begin
SendLog(I);
End;
End;
end;
nơi WM_UPDATEDATA là một thông điệp tùy chỉnh, định nghĩa dưới đây:
const
WM_UPDATEDATA = WM_USER + 100;
Và trong hình thức chính, nó sẽ làm như sau để cập nhật danh sách:
procedure TForm1.WMUpdateData(var msg : TMessage);
begin
List1.Items.Add(PChar(msg.WParam));
end;
Tuy nhiên, khi Log chuỗi được gửi đến biểu mẫu chính là một biến cục bộ, biến này sẽ bị hủy sau khi gọi SendLog. Trong khi TForm1.WMUpdateData xử lý thông báo một cách không đồng bộ, vì vậy có thể khi nó được gọi, chuỗi Log đã bị hủy. Làm thế nào để giải quyết vấn đề này? Tôi nghĩ rằng có lẽ tôi có thể phân bổ không gian chuỗi trong một không gian hệ thống toàn cầu, và sau đó chuyển nó vào tin nhắn, sau đó sau khi TForm1.WMUpdateData xử lý thông báo, nó có thể phá hủy không gian chuỗi trong không gian toàn cục. Đó có phải là giải pháp khả thi không? Làm thế nào để thực hiện điều này?
Cảm ơn
Look đây http://stackoverflow.com/questions/9932164/postmessage-lparam-truncation Hy vọng rằng nó sẽ giúp – Arkady
Bạn cần phải khai báo biến Log của bạn như là một biến toàn cầu. –
@ S.MAHDI Không! Điều gì sẽ xảy ra nếu có hai thư được xếp hàng đợi? –