![]() |
|
Writefile yazılan byte sorunu - 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ığı: Writefile yazılan byte sorunu (/showthread.php?tid=3935) |
Writefile yazılan byte sorunu - seci20 - 03-09-2019 Ustalarım iyi forumlar. Comport yazdırdığım datanın doğruluğunu test etmek için ne kadar byte yazdığına bakıyorum. Lakin yazılan byte hep 0 olarak geri dönüyor. Ttask içindede dışındada aynı durum oluyor sebebini bir türlü bulamadım. function TComPort.WritePort(Const Buffer; Count: Integer): Integer; var Task: ITask; I: Integer; Stopwatch: TStopwatch; Success: Boolean; BytesWritten: DWORD; WriteBuffer: TMyByteArray; Overlapped: TOverlapped; begin SetLength(WriteBuffer, Count); MoveMemory(@WriteBuffer[0], @Buffer, Length(WriteBuffer)); Task := TTASK.Create( procedure begin PurgeComm(PHandle, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR); FillChar(Overlapped, SizeOf(Overlapped), 0); Overlapped.hEvent := CreateEvent(nil, False, False, nil); Success := WriteFile(PHandle, WriteBuffer[0], Count, BytesWritten, @Overlapped) or (GetLastError = ERROR_IO_PENDING); WaitForSingleObject(Overlapped.hEvent, 4000); if Overlapped.hEvent <> 0 then CloseHandle(Overlapped.hEvent); end ); Task.Start(); Stopwatch := TStopwatch.StartNew; try I := 0; while I < 10 do begin I := Ceil(Stopwatch.Elapsed.TotalSeconds); IF Task.STATUS = TTASKSTATUS.COMPLETED THEN Break; IF Task.STATUS = TTASKSTATUS.EXCEPTION THEN exit(-1); Application.ProcessMessages; end; if not Success then exit(-1); Result := BytesWritten; finally Stopwatch.Stop; end; end; Normalde TTask kullanmasamda gene aynı şekilde 0 olarak döndürüyor. Atladığım bir konumu var yardımcı olabilirmisiniz ? Writefile yazılan byte sorunu - Tuğrul HELVACI - 04-09-2019 Burada CreateFile önemli. Görüldüğü üzere yazma işlemini Overlapped olarak yapıyorsunuz, thread kullandığınız için Overlapped kullanmasanız da olur. Overlapped yazdırma asenkron olduğu için yazılan byte'ı kontrol ettiğinizde doğru değeri göremeyebilirsiniz. Bu nedenle Overlapped'ı iptal edip öyle deneyin. Writefile yazılan byte sorunu - seci20 - 04-09-2019 Hocam cevap verdiğiniz için teşekkür ederim. Overlapped kaldırınca dediğiniz gibi düzeldi teşekkür ederim. |