summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/serialport/qserialport_win.cpp39
-rw-r--r--src/serialport/qserialport_win_p.h2
2 files changed, 29 insertions, 12 deletions
diff --git a/src/serialport/qserialport_win.cpp b/src/serialport/qserialport_win.cpp
index 9b04083..6e6f7c6 100644
--- a/src/serialport/qserialport_win.cpp
+++ b/src/serialport/qserialport_win.cpp
@@ -48,6 +48,7 @@
#ifndef Q_OS_WINCE
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qvector.h>
+#include <QtCore/qtimer.h>
#endif
#include <QtCore/qwineventnotifier.h>
@@ -106,6 +107,7 @@ QSerialPortPrivate::QSerialPortPrivate(QSerialPort *q)
, communicationNotifier(new QWinEventNotifier(q))
, readCompletionNotifier(new QWinEventNotifier(q))
, writeCompletionNotifier(new QWinEventNotifier(q))
+ , startAsyncWriteTimer(0)
, originalEventMask(0)
, triggeredEventMask(0)
{
@@ -378,8 +380,16 @@ bool QSerialPortPrivate::setBreakEnabled(bool set)
void QSerialPortPrivate::startWriting()
{
- if (!writeStarted)
- startAsyncWrite();
+ Q_Q(QSerialPort);
+
+ if (!writeStarted) {
+ if (!startAsyncWriteTimer) {
+ startAsyncWriteTimer = new QTimer(q);
+ q->connect(startAsyncWriteTimer, SIGNAL(timeout()), q, SLOT(_q_completeAsyncWrite()));
+ startAsyncWriteTimer->setSingleShot(true);
+ }
+ startAsyncWriteTimer->start(0);
+ }
}
bool QSerialPortPrivate::waitForReadyRead(int msecs)
@@ -432,6 +442,9 @@ bool QSerialPortPrivate::waitForBytesWritten(int msecs)
QElapsedTimer stopWatch;
stopWatch.start();
+ if (!writeStarted)
+ startAsyncWrite();
+
forever {
bool timedOut = false;
HANDLE triggeredEvent = 0;
@@ -620,17 +633,19 @@ void QSerialPortPrivate::_q_completeAsyncWrite()
{
Q_Q(QSerialPort);
- writeStarted = false;
- DWORD numberOfBytesTransferred = 0;
- if (!::GetOverlappedResult(handle, &writeCompletionOverlapped, &numberOfBytesTransferred, FALSE)) {
- numberOfBytesTransferred = 0;
- q->setError(decodeSystemError());
- return;
- }
+ if (writeStarted) {
+ writeStarted = false;
+ DWORD numberOfBytesTransferred = 0;
+ if (!::GetOverlappedResult(handle, &writeCompletionOverlapped, &numberOfBytesTransferred, FALSE)) {
+ numberOfBytesTransferred = 0;
+ q->setError(decodeSystemError());
+ return;
+ }
- if (numberOfBytesTransferred > 0) {
- writeBuffer.free(numberOfBytesTransferred);
- emit q->bytesWritten(numberOfBytesTransferred);
+ if (numberOfBytesTransferred > 0) {
+ writeBuffer.free(numberOfBytesTransferred);
+ emit q->bytesWritten(numberOfBytesTransferred);
+ }
}
startAsyncWrite();
diff --git a/src/serialport/qserialport_win_p.h b/src/serialport/qserialport_win_p.h
index dd6ae0e..461226b 100644
--- a/src/serialport/qserialport_win_p.h
+++ b/src/serialport/qserialport_win_p.h
@@ -51,6 +51,7 @@
#include <QtCore/qhash.h>
QT_BEGIN_NAMESPACE
class QWinEventNotifier;
+class QTimer;
#else
#include <QtCore/qmutex.h>
QT_BEGIN_NAMESPACE
@@ -131,6 +132,7 @@ public:
QWinEventNotifier *communicationNotifier;
QWinEventNotifier *readCompletionNotifier;
QWinEventNotifier *writeCompletionNotifier;
+ QTimer *startAsyncWriteTimer;
OVERLAPPED communicationOverlapped;
OVERLAPPED readCompletionOverlapped;
OVERLAPPED writeCompletionOverlapped;