Tôi đang lập trình ứng dụng đa luồng. Tôi có hai chủ đề. Bật là để chuyển một số dữ liệu từ thiết bị sang bộ đệm dữ liệu toàn cục và thứ hai là ghi dữ liệu đó vào tệp.Cách thực hành tốt nhất về cách đợi dữ liệu trong chuỗi và ghi vào tệp?
Dữ liệu từ thiết bị đến bộ đệm đang chuyển không đồng bộ. Mục đích của luồng thứ hai nên đợi cho số lượng dữ liệu được chỉ định được ghi vào bộ đệm dữ liệu chính và cuối cùng là ghi nó vào tệp.
Chủ đề đầu tiên ở định dạng DLL và chuỗi thứ hai nằm trong ứng dụng chính. Tạm thời tôi giải quyết điều này với các sự kiện. Chủ đề đầu tiên chuyển dữ liệu từ thiết bị đến bộ đệm dữ liệu chính và đếm dữ liệu và khi số lượng dữ liệu được chỉ định được truyền, nó sẽ đặt một sự kiện. Thứ hai chờ đợi cho sự kiện được báo hiệu và khi nào nó chạy một số mã để lưu trữ dữ liệu. Đơn giản vì nó đang hoạt động.
Thread1.Execute:
var DataCount, TransferedData: Integer;
DataCounter := 0;
while not Terminted do
begin
TransferData(@pData, TransferedData);
Inc(DataCounter, TransferedData)
if DataCounter >= DataCountToNotify then SetEvent(hDataCount);
end;
Thread2.Execute:
hndlArr[0] := hDataCount;
hndlArr[1] := hTerminateEvent;
while (not Terminated) do
begin
wRes := WaitForMultipleObjects(HandlesCount, Addr(hndlArr), false, 60000);
case wRes of
WAIT_OBJECT_0:
begin
Synchronize(WriteBuffer); // call it from main thread
ResetEvent(hndlArr[0]);
end;
WAIT_OBJECT_0 + 1:
begin
ResetEvent(hTerminateEvent);
break;
end;
WAIT_TIMEOUT: Break;
end;
end;
Bây giờ tôi muốn tạo chuỗi thứ hai độc lập hơn ... vì vậy tôi có thể tạo nhiều phiên bản của chuỗi thứ hai và tôi không cần phải chờ chuỗi đầu tiên. Tôi muốn di chuyển dữ liệu đếm một phần mã từ chuỗi đầu tiên sang chuỗi thứ hai để tôi không cần đếm dữ liệu trong chuỗi đầu tiên nữa. Đầu tiên sẽ chỉ dành cho mục đích chuyển dữ liệu.
Tôi muốn sử dụng thứ hai làm bộ đếm dữ liệu và lưu trữ dữ liệu. Nhưng bây giờ tôi sẽ phải lặp lại và liên tục kiểm tra thủ công cho số lượng dữ liệu được chỉ định. Nếu tôi có vòng lặp, tôi sẽ phải thêm một số giấc ngủ để chủ đề thứ hai sẽ không làm giảm hiệu suất máy tính nhưng tôi không biết phải ngủ bao lâu trong khi tốc độ truyền dữ liệu trong chuỗi không ổn định và do đó tốc độ đếm trong chuỗi thứ hai sẽ thay đổi.
Tôi đoán rằng mẫu mã này là không tốt:
Thread2.Execute:
var DataCount: Integer;
DataIdx1 := GetCurrentDataIdx;
while (not Terminated) do
begin
if (GetCurrentDataIdx - DataIdx1) >= DataCountToNotify then
begin
Synchronize(WriteBuffer);
DataIdx1 := GetCurrentIdx;
end;
sleep(???);
end;
Vì vậy, câu hỏi của tôi là phương pháp tốt nhất để giải quyết vấn đề đó với đếm dữ liệu và lưu trữ nó trong chủ đề thứ hai là gì? Kinh nghiệm và đề xuất của bạn là gì?
Tại sao bạn buộc ghi tệp vào chuỗi chính, 'Đồng bộ hóa (WriteBuffer) '? Tôi không hiểu làm thế nào bạn sẽ quản lý để nhân các chủ đề thứ hai và vẫn duy trì để viết một tập tin duy nhất. –
Chủ đề sẽ được nhân nhưng dữ liệu sẽ được lưu vào các tệp khác nhau. Tôi không có nơi nào viết, tôi sẽ viết nó vào cùng một tập tin. Mục tiêu của tôi là có nhiều điều khiển có thể lưu trữ dữ liệu từ cùng một nguồn đến các tệp khác nhau. – Nix
Điều đó là tốt để biết, vì câu trả lời sẽ phụ thuộc vào thông tin này. Tôi vẫn tự hỏi tại sao việc ghi tập tin phải được thực thi với chủ đề chính. –