Delphi Can
Bu thread kullanımı doğrumu ? - Baskı Önizleme

+- Delphi Can (https://www.delphican.com)
+-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3)
+--- Forum: Genel Programlama (https://www.delphican.com/forumdisplay.php?fid=6)
+--- Konu Başlığı: Bu thread kullanımı doğrumu ? (/showthread.php?tid=6260)



Bu thread kullanımı doğrumu ? - seci20 - 05-09-2021

Merhaba ustalarım.Serial port üzerinden cihazlarlar veri alışverişinde bulunurken bazen verilerin geç gelmesi yada bağlantı kopması gibi durumlar olduğu için, main form donmaması amacıyla thread kullanmaya karar verdim. Ama bazen read başarılı olduğu halde veri 00 olarak geliyor. Thread kullanmasam bir sorun olmuyor ama kullanırsam dediğim gibi farklı hatalarla karşılaşıyorum.

Bu thread kullanımı doğrumu ? Yardımcı olursanız çok sevinirim.


var
 lOverlapped: OVERLAPPED;
 lLastError, BytesTrans: Cardinal;
 lEvent: TEvent;
 Task: ITask;
 TmpBuf: TMyByteArray;
 CanWrite: Boolean;
begin

 if UsbHandle = INVALID_HANDLE_VALUE then
exit(-1);


 SetLength(TmpBuf, Count);
 ZeroMemory(TmpBuf, Length(TmpBuf));
 lEvent := TEvent.Create(nil, FALSE, FALSE, '');
 FillChar(lOverlapped, SizeOf(lOverlapped), 0);
 lOverlapped.hEvent := lEvent.Handle;
 CanWrite := ReadFile(UsbHandle, TmpBuf[0], Count, BytesTrans, @lOverlapped);

 try
   if not CanWrite then
   begin

     lLastError := GetLastError;

     if (lLastError <> ERROR_IO_PENDING) then
       exit;
     Task := TTASK.Create(
       procedure
       begin

         case lEvent.WaitFor(12000) of
           wrSignaled:
             if not GetOverlappedResult(UsbHandle, lOverlapped, BytesTrans,
               FALSE) then
               exit;

           wrError:
             begin
               lLastError := lEvent.LastError;

               if CancelIo(UsbHandle) then
                 lEvent.WaitFor(12000);
               exit;
             end;
         end;

         CanWrite := True;

       end);
     Task.Start();

     while Task.STATUS <> TTASKSTATUS.COMPLETED do
     begin
       IF(Task.STATUS = TTASKSTATUS.EXCEPTION) THEN
       exit(-1);
       Application.ProcessMessages;

     end;

     if not CanWrite then
     exit(-1);

   end;

   Result := BytesTrans;
   SetLength(TmpBuf, BytesTrans);
   MoveMemory(@Buffer, @TmpBuf[0], Length(TmpBuf));
   Application.ProcessMessages;
 finally
   FreeAndNil(lEvent);
 end;