Qt 4.8
Signals | Public Functions | Protected Functions | Properties | List of all members
QWindowsPipeWriter Class Reference

#include <qwindowspipewriter_p.h>

Inheritance diagram for QWindowsPipeWriter:
QThread QObject

Signals

void bytesWritten (qint64 bytes)
 
void canWrite ()
 
- Signals inherited from QThread
void finished ()
 This signal is emitted when the thread has finished executing. More...
 
void started ()
 This signal is emitted when the thread starts executing. More...
 
void terminated ()
 This signal is emitted when the thread is terminated. More...
 
- Signals inherited from QObject
void destroyed (QObject *=0)
 This signal is emitted immediately before the object obj is destroyed, and can not be blocked. More...
 

Public Functions

qint64 bytesToWrite () const
 
bool hadWritten () const
 
 QWindowsPipeWriter (HANDLE writePipe, QObject *parent=0)
 
bool waitForWrite (int msecs)
 
qint64 write (const char *data, qint64 maxlen)
 
 ~QWindowsPipeWriter ()
 
- Public Functions inherited from QThread
void exit (int retcode=0)
 Tells the thread's event loop to exit with a return code. More...
 
bool isFinished () const
 Returns true if the thread is finished; otherwise returns false. More...
 
bool isRunning () const
 Returns true if the thread is running; otherwise returns false. More...
 
Priority priority () const
 Returns the priority for a running thread. More...
 
 QThread (QObject *parent=0)
 Constructs a new QThread to manage a new thread. More...
 
void setPriority (Priority priority)
 This function sets the priority for a running thread. More...
 
void setStackSize (uint stackSize)
 Sets the maximum stack size for the thread to stackSize. More...
 
uint stackSize () const
 Returns the maximum stack size for the thread (if set with setStackSize()); otherwise returns zero. More...
 
bool wait (unsigned long time=ULONG_MAX)
 Blocks the thread until either of these conditions is met: More...
 
 ~QThread ()
 Destroys the QThread. More...
 
- Public Functions inherited from QObject
bool blockSignals (bool b)
 If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke anything connected to it). More...
 
const QObjectListchildren () const
 Returns a list of child objects. More...
 
bool connect (const QObject *sender, const char *signal, const char *member, Qt::ConnectionType type=Qt::AutoConnection) const
 
bool disconnect (const char *signal=0, const QObject *receiver=0, const char *member=0)
 
bool disconnect (const QObject *receiver, const char *member=0)
 
void dumpObjectInfo ()
 Dumps information about signal connections, etc. More...
 
void dumpObjectTree ()
 Dumps a tree of children to the debug output. More...
 
QList< QByteArraydynamicPropertyNames () const
 Returns the names of all properties that were dynamically added to the object using setProperty(). More...
 
virtual bool event (QEvent *)
 This virtual function receives events to an object and should return true if the event e was recognized and processed. More...
 
virtual bool eventFilter (QObject *, QEvent *)
 Filters events if this object has been installed as an event filter for the watched object. More...
 
template<typename T >
findChild (const QString &aName=QString()) const
 Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. More...
 
template<typename T >
QList< T > findChildren (const QString &aName=QString()) const
 Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects. More...
 
template<typename T >
QList< T > findChildren (const QRegExp &re) const
 
bool inherits (const char *classname) const
 Returns true if this object is an instance of a class that inherits className or a QObject subclass that inherits className; otherwise returns false. More...
 
void installEventFilter (QObject *)
 Installs an event filter filterObj on this object. More...
 
bool isWidgetType () const
 Returns true if the object is a widget; otherwise returns false. More...
 
void killTimer (int id)
 Kills the timer with timer identifier, id. More...
 
virtual const QMetaObjectmetaObject () const
 Returns a pointer to the meta-object of this object. More...
 
void moveToThread (QThread *thread)
 Changes the thread affinity for this object and its children. More...
 
QString objectName () const
 
QObjectparent () const
 Returns a pointer to the parent object. More...
 
QVariant property (const char *name) const
 Returns the value of the object's name property. More...
 
Q_INVOKABLE QObject (QObject *parent=0)
 Constructs an object with parent object parent. More...
 
void removeEventFilter (QObject *)
 Removes an event filter object obj from this object. More...
 
void setObjectName (const QString &name)
 
void setParent (QObject *)
 Makes the object a child of parent. More...
 
bool setProperty (const char *name, const QVariant &value)
 Sets the value of the object's name property to value. More...
 
void setUserData (uint id, QObjectUserData *data)
 
bool signalsBlocked () const
 Returns true if signals are blocked; otherwise returns false. More...
 
int startTimer (int interval)
 Starts a timer and returns a timer identifier, or returns zero if it could not start a timer. More...
 
QThreadthread () const
 Returns the thread in which the object lives. More...
 
QObjectUserDatauserData (uint id) const
 
virtual ~QObject ()
 Destroys the object, deleting all its child objects. More...
 

Protected Functions

void run ()
 The starting point for the thread. More...
 
- Protected Functions inherited from QThread
int exec ()
 Enters the event loop and waits until exit() is called, returning the value that was passed to exit(). More...
 
 QThread (QThreadPrivate &dd, QObject *parent=0)
 
- Protected Functions inherited from QObject
virtual void childEvent (QChildEvent *)
 This event handler can be reimplemented in a subclass to receive child events. More...
 
virtual void connectNotify (const char *signal)
 This virtual function is called when something has been connected to signal in this object. More...
 
virtual void customEvent (QEvent *)
 This event handler can be reimplemented in a subclass to receive custom events. More...
 
virtual void disconnectNotify (const char *signal)
 This virtual function is called when something has been disconnected from signal in this object. More...
 
 QObject (QObjectPrivate &dd, QObject *parent=0)
 
int receivers (const char *signal) const
 Returns the number of receivers connected to the signal. More...
 
QObjectsender () const
 Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; otherwise it returns 0. More...
 
int senderSignalIndex () const
 
virtual void timerEvent (QTimerEvent *)
 This event handler can be reimplemented in a subclass to receive timer events for the object. More...
 

Properties

QByteArray data
 
bool hasWritten
 
QMutex lock
 
volatile bool quitNow
 
QWaitCondition waitCondition
 
HANDLE writePipe
 

Additional Inherited Members

- Public Types inherited from QThread
enum  Priority {
  IdlePriority, LowestPriority, LowPriority, NormalPriority,
  HighPriority, HighestPriority, TimeCriticalPriority, InheritPriority
}
 This enum type indicates how the operating system should schedule newly created threads. More...
 
- Public Slots inherited from QThread
void quit ()
 Tells the thread's event loop to exit with return code 0 (success). More...
 
void start (Priority=InheritPriority)
 Begins execution of the thread by calling run(). More...
 
void terminate ()
 Terminates the execution of the thread. More...
 
- Public Slots inherited from QObject
void deleteLater ()
 Schedules this object for deletion. More...
 
- Static Public Functions inherited from QThread
static QThreadcurrentThread ()
 Returns a pointer to a QThread which manages the currently executing thread. More...
 
static Qt::HANDLE currentThreadId ()
 Returns the thread handle of the currently executing thread. More...
 
static int idealThreadCount ()
 Returns the ideal number of threads that can be run on the system. More...
 
static void yieldCurrentThread ()
 Yields execution of the current thread to another runnable thread, if any. More...
 
- Static Public Functions inherited from QObject
static bool connect (const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
 Creates a connection of the given type from the signal in the sender object to the method in the receiver object. More...
 
static bool connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type=Qt::AutoConnection)
 
static bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *member)
 Disconnects signal in object sender from method in object receiver. More...
 
static bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &member)
 
static uint registerUserData ()
 
static QString tr (const char *sourceText, const char *comment=0, int n=-1)
 
static QString trUtf8 (const char *sourceText, const char *comment=0, int n=-1)
 
- Static Public Variables inherited from QObject
static const QMetaObject staticMetaObject
 This variable stores the meta-object for the class. More...
 
- Static Protected Functions inherited from QThread
static void msleep (unsigned long)
 Forces the current thread to sleep for msecs milliseconds. More...
 
static void setTerminationEnabled (bool enabled=true)
 Enables or disables termination of the current thread based on the enabled parameter. More...
 
static void sleep (unsigned long)
 Forces the current thread to sleep for secs seconds. More...
 
static void usleep (unsigned long)
 Forces the current thread to sleep for usecs microseconds. More...
 
- Protected Variables inherited from QObject
QScopedPointer< QObjectDatad_ptr
 
- Static Protected Variables inherited from QObject
static const QMetaObject staticQtMetaObject
 

Detailed Description

Definition at line 118 of file qwindowspipewriter_p.h.

Constructors and Destructors

◆ QWindowsPipeWriter()

QWindowsPipeWriter::QWindowsPipeWriter ( HANDLE  writePipe,
QObject parent = 0 
)

Definition at line 49 of file qwindowspipewriter.cpp.

50  : QThread(parent),
51  writePipe(INVALID_HANDLE_VALUE),
52  quitNow(false),
53  hasWritten(false)
54 {
55 #if !defined(Q_OS_WINCE) || (_WIN32_WCE >= 0x600)
56  DuplicateHandle(GetCurrentProcess(), pipe, GetCurrentProcess(),
57  &writePipe, 0, FALSE, DUPLICATE_SAME_ACCESS);
58 #else
59  Q_UNUSED(pipe);
60  writePipe = GetCurrentProcess();
61 #endif
62 }
QThread(QObject *parent=0)
Constructs a new QThread to manage a new thread.
Definition: qthread.cpp:433
#define FALSE
Synonym for false.
Definition: qglobal.h:1019
#define Q_UNUSED(x)
Indicates to the compiler that the parameter with the specified name is not used in the body of a fun...
Definition: qglobal.h:1729

◆ ~QWindowsPipeWriter()

QWindowsPipeWriter::~QWindowsPipeWriter ( )

Definition at line 64 of file qwindowspipewriter.cpp.

65 {
66  lock.lock();
67  quitNow = true;
69  lock.unlock();
70  if (!wait(30000))
71  terminate();
72 #if !defined(Q_OS_WINCE) || (_WIN32_WCE >= 0x600)
73  CloseHandle(writePipe);
74 #endif
75 }
void lock()
Locks the mutex.
Definition: qmutex.cpp:151
void unlock()
Unlocks the mutex.
Definition: qmutex.cpp:296
QWaitCondition waitCondition
bool wait(unsigned long time=ULONG_MAX)
Blocks the thread until either of these conditions is met:
void terminate()
Terminates the execution of the thread.

Functions

◆ bytesToWrite()

qint64 QWindowsPipeWriter::bytesToWrite ( ) const
inline

Definition at line 133 of file qwindowspipewriter_p.h.

Referenced by QProcessPrivate::flushPipeWriter(), QProcessPrivate::pipeWriterBytesToWrite(), and qt_terminateApp().

134  {
135  QMutexLocker locker(&lock);
136  return data.size();
137  }
The QMutexLocker class is a convenience class that simplifies locking and unlocking mutexes...
Definition: qmutex.h:101
int size() const
Returns the number of bytes in this byte array.
Definition: qbytearray.h:402

◆ bytesWritten

void QWindowsPipeWriter::bytesWritten ( qint64  bytes)
signal

Referenced by run().

◆ canWrite

void QWindowsPipeWriter::canWrite ( )
signal

Referenced by run().

◆ hadWritten()

bool QWindowsPipeWriter::hadWritten ( ) const
inline

Definition at line 139 of file qwindowspipewriter_p.h.

Referenced by qt_terminateApp(), and waitForWrite().

140  {
141  return hasWritten;
142  }

◆ run()

void QWindowsPipeWriter::run ( void  )
protectedvirtual

The starting point for the thread.

After calling start(), the newly created thread calls this function. The default implementation simply calls exec().

You can reimplement this function to facilitate advanced thread management. Returning from this method will end the execution of the thread.

See also
start() wait()

Reimplemented from QThread.

Definition at line 102 of file qwindowspipewriter.cpp.

103 {
104  OVERLAPPED overl;
105  memset(&overl, 0, sizeof overl);
106  overl.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
107  forever {
108  lock.lock();
109  while(data.isEmpty() && (!quitNow)) {
112  }
113 
114  if (quitNow) {
115  lock.unlock();
116  quitNow = false;
117  break;
118  }
119 
120  QByteArray copy = data;
121 
122  lock.unlock();
123 
124  const char *ptrData = copy.data();
125  qint64 maxlen = copy.size();
126  qint64 totalWritten = 0;
127  overl.Offset = 0;
128  overl.OffsetHigh = 0;
129  while ((!quitNow) && totalWritten < maxlen) {
130  DWORD written = 0;
131  if (!WriteFile(writePipe, ptrData + totalWritten,
132  maxlen - totalWritten, &written, &overl)) {
133 
134  if (GetLastError() == 0xE8/*NT_STATUS_INVALID_USER_BUFFER*/) {
135  // give the os a rest
136  msleep(100);
137  continue;
138  }
139 #ifndef Q_OS_WINCE
140  if (GetLastError() == ERROR_IO_PENDING) {
141  if (!GetOverlappedResult(writePipe, &overl, &written, TRUE)) {
142  CloseHandle(overl.hEvent);
143  return;
144  }
145  } else {
146  CloseHandle(overl.hEvent);
147  return;
148  }
149 #else
150  return;
151 #endif
152  }
153  totalWritten += written;
154 #if defined QPIPEWRITER_DEBUG
155  qDebug("QWindowsPipeWriter::run() wrote %d %d/%d bytes",
156  written, int(totalWritten), int(maxlen));
157 #endif
158  lock.lock();
159  data.remove(0, written);
160  hasWritten = true;
161  lock.unlock();
162  }
163  emit bytesWritten(totalWritten);
164  emit canWrite();
165  }
166  CloseHandle(overl.hEvent);
167 }
void lock()
Locks the mutex.
Definition: qmutex.cpp:151
char * data()
Returns a pointer to the data stored in the byte array.
Definition: qbytearray.h:429
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:135
static void msleep(unsigned long)
Forces the current thread to sleep for msecs milliseconds.
Q_CORE_EXPORT void qDebug(const char *,...)
#define emit
Definition: qobjectdefs.h:76
#define FALSE
Synonym for false.
Definition: qglobal.h:1019
__int64 qint64
Definition: qglobal.h:942
void unlock()
Unlocks the mutex.
Definition: qmutex.cpp:296
bool wait(QMutex *mutex, unsigned long time=ULONG_MAX)
#define TRUE
Synonym for true.
Definition: qglobal.h:1018
QWaitCondition waitCondition
void bytesWritten(qint64 bytes)
int size() const
Returns the number of bytes in this byte array.
Definition: qbytearray.h:402
bool isEmpty() const
Returns true if the byte array has size 0; otherwise returns false.
Definition: qbytearray.h:421
QByteArray & remove(int index, int len)
Removes len bytes from the array, starting at index position pos, and returns a reference to the arra...
#define forever
This macro is provided for convenience for writing infinite loops.
Definition: qglobal.h:2452

◆ waitForWrite()

bool QWindowsPipeWriter::waitForWrite ( int  msecs)

Definition at line 77 of file qwindowspipewriter.cpp.

Referenced by QProcessPrivate::flushPipeWriter(), QProcessPrivate::pipeWriterBytesToWrite(), and qt_terminateApp().

78 {
79  QMutexLocker locker(&lock);
80  bool hadWritten = hasWritten;
81  hasWritten = false;
82  if (hadWritten)
83  return true;
84  if (!waitCondition.wait(&lock, msecs))
85  return false;
86  hadWritten = hasWritten;
87  hasWritten = false;
88  return hadWritten;
89 }
bool wait(QMutex *mutex, unsigned long time=ULONG_MAX)
QWaitCondition waitCondition
The QMutexLocker class is a convenience class that simplifies locking and unlocking mutexes...
Definition: qmutex.h:101

◆ write()

qint64 QWindowsPipeWriter::write ( const char *  data,
qint64  maxlen 
)

Definition at line 91 of file qwindowspipewriter.cpp.

Referenced by QProcessPrivate::pipeWriterBytesToWrite().

92 {
93  if (!isRunning())
94  return -1;
95 
96  QMutexLocker locker(&lock);
97  data.append(QByteArray(ptr, maxlen));
99  return maxlen;
100 }
QByteArray & append(char c)
Appends the character ch to this byte array.
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:135
const T * ptr(const T &t)
QWaitCondition waitCondition
The QMutexLocker class is a convenience class that simplifies locking and unlocking mutexes...
Definition: qmutex.h:101
bool isRunning() const
Returns true if the thread is running; otherwise returns false.
Definition: qthread.cpp:494

Properties

◆ data

QByteArray QWindowsPipeWriter::data
private

Definition at line 148 of file qwindowspipewriter_p.h.

Referenced by run(), and write().

◆ hasWritten

bool QWindowsPipeWriter::hasWritten
private

Definition at line 153 of file qwindowspipewriter_p.h.

Referenced by run(), and waitForWrite().

◆ lock

QMutex QWindowsPipeWriter::lock
mutableprivate

Definition at line 150 of file qwindowspipewriter_p.h.

Referenced by run(), waitForWrite(), write(), and ~QWindowsPipeWriter().

◆ quitNow

volatile bool QWindowsPipeWriter::quitNow
private

Definition at line 152 of file qwindowspipewriter_p.h.

Referenced by run(), and ~QWindowsPipeWriter().

◆ waitCondition

QWaitCondition QWindowsPipeWriter::waitCondition
private

Definition at line 149 of file qwindowspipewriter_p.h.

Referenced by run(), waitForWrite(), write(), and ~QWindowsPipeWriter().

◆ writePipe

HANDLE QWindowsPipeWriter::writePipe
private

Definition at line 151 of file qwindowspipewriter_p.h.

Referenced by QWindowsPipeWriter(), run(), and ~QWindowsPipeWriter().


The documentation for this class was generated from the following files: