небольшая чистка и улучшение кода, попытка исправить picloud
This commit is contained in:
@@ -977,14 +977,14 @@ bool PIEthernet::connectTCP() {
|
||||
#ifdef WINDOWS
|
||||
long PIEthernet::waitForEvent(long mask) {
|
||||
if (!PRIVATE->event.isCreate() || sock < 0) return 0;
|
||||
WSAEventSelect(sock, PRIVATE->event.event, mask);
|
||||
WSAEventSelect(sock, PRIVATE->event.getEvent(), mask);
|
||||
if (PRIVATE->event.wait()) {
|
||||
//DWORD wr = WSAWaitForMultipleEvents(1, &(PRIVATE->read_event), FALSE, WSA_INFINITE, TRUE);
|
||||
//piCout << "wait result" << wr;
|
||||
//if (wr == WSA_WAIT_EVENT_0) {
|
||||
WSANETWORKEVENTS events;
|
||||
memset(&events, 0, sizeof(events));
|
||||
WSAEnumNetworkEvents(sock, PRIVATE->event.event, &events);
|
||||
WSAEnumNetworkEvents(sock, PRIVATE->event.getEvent(), &events);
|
||||
//piCout << "wait result" << events.lNetworkEvents;
|
||||
return events.lNetworkEvents;
|
||||
}
|
||||
|
||||
@@ -439,9 +439,7 @@ PIByteArray PIFile::get() {
|
||||
|
||||
ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (!canRead() || PRIVATE->fd == 0) return -1;
|
||||
reading_now = true;
|
||||
ssize_t ret = fread(read_to, 1, max_size, PRIVATE->fd);
|
||||
reading_now = false;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,11 +217,8 @@ void PIIODevice::stopThreadedRead() {
|
||||
read_thread.stop();
|
||||
if (!destroying) {
|
||||
interrupt();
|
||||
stopThreadedReadDevice();
|
||||
}
|
||||
if (reading_now) {
|
||||
read_thread.terminate();
|
||||
reading_now = false;
|
||||
} else {
|
||||
piCoutObj << "Error: Device is running after destructor!";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -307,7 +304,6 @@ ssize_t PIIODevice::write(const void * data, ssize_t max_size) {
|
||||
|
||||
|
||||
void PIIODevice::_init() {
|
||||
reading_now = false;
|
||||
setOptions(0);
|
||||
setReopenEnabled(true);
|
||||
setReopenTimeout(1000);
|
||||
|
||||
@@ -498,10 +498,6 @@ protected:
|
||||
//! \~english Function executed when thread read some data, default implementation execute external callback "ret_func_"
|
||||
//! \~russian Метод вызывается после каждого успешного потокового чтения, по умолчанию вызывает callback "ret_func_"
|
||||
virtual bool threadedRead(const uchar * readed, ssize_t size);
|
||||
|
||||
//! \~english Function executed after PIThread::stop() and PIThread::interrupt() of read thread
|
||||
//! \~russian Метод вызывается после PIThread::stop() и PIThread::interrupt() потока чтения
|
||||
virtual void stopThreadedReadDevice() {}
|
||||
|
||||
//! \~english Reimplement to construct full unambiguous string, describes this device.
|
||||
//! Default implementation returns \a path()
|
||||
@@ -549,10 +545,6 @@ protected:
|
||||
bool opened_ = false;
|
||||
void * ret_data_ = nullptr;
|
||||
|
||||
//! \~english Set this flag while blocking operations
|
||||
//! \~russian Устанавливайте этот флаг во время блокирующих операций
|
||||
std::atomic_bool reading_now;
|
||||
|
||||
private:
|
||||
EVENT_HANDLER(void, read_func);
|
||||
EVENT_HANDLER(void, write_func);
|
||||
|
||||
@@ -814,7 +814,7 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (sending) return -1;
|
||||
//piCoutObj << "read ..." << PRIVATE->hCom;
|
||||
memset(&(PRIVATE->overlap), 0, sizeof(PRIVATE->overlap));
|
||||
PRIVATE->overlap.hEvent = PRIVATE->event.event;
|
||||
PRIVATE->overlap.hEvent = PRIVATE->event.getEvent();
|
||||
ReadFile(PRIVATE->hCom, read_to, max_size, NULL, &(PRIVATE->overlap));
|
||||
PRIVATE->readed = 0;
|
||||
if (PRIVATE->event.wait()) {
|
||||
@@ -860,7 +860,7 @@ ssize_t PISerial::writeDevice(const void * data, ssize_t max_size) {
|
||||
//piCoutObj << "send ..." << max_size;// << ": " << PIString((char*)data, max_size);
|
||||
sending = true;
|
||||
memset(&(PRIVATE->overlap_write), 0, sizeof(PRIVATE->overlap_write));
|
||||
PRIVATE->overlap_write.hEvent = PRIVATE->event_write.event;
|
||||
PRIVATE->overlap_write.hEvent = PRIVATE->event_write.getEvent();
|
||||
WriteFile(PRIVATE->hCom, data, max_size, NULL, &(PRIVATE->overlap_write));
|
||||
if (PRIVATE->event_write.wait()) {
|
||||
GetOverlappedResult(PRIVATE->hCom, &(PRIVATE->overlap_write), &wrote, FALSE);
|
||||
|
||||
Reference in New Issue
Block a user