URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5287
[ Назад ]

Исходное сообщение
"можно ли запустить метод объекта нитью (thread) ?"

Отправлено pyatak , 28-Мрт-06 19:55 
Скачал библиотеку с классом для работы с ком портом ( http://xor-011.narod.ru/programming/comport.rar  4 KB:) Она не компилируется (Asp 10, KDevelop).

В библиотеке описан такой класс ComPort:


class ComPort : public QObject
{
          .....................
    bool Open(int lNumPort,int lSpeed, int lSize, eParity lParity, bool lStopBit,   eProtocol lProtocol);
...........................................
    
    void* slotReadThreadNON(void*);
    
    void* slotReadThreadQPD(void*);
    
    void* slotReadThreadQSU(void*);

.......................................


В методе open должен запускаться либо slotReadThreadNON, либо slotReadThreadQPD,
либо slotReadThreadQSU как thread с помощью pthread_create из <pthread.h> :


bool ComPort::Open(int lNumPort, int lSpeed, int lSize, eParity lParity, bool lStopBit, eProtocol lProtocol)
{

..............................................

    switch (lProtocol)
    {
      case qpd:
        if (pthread_create(&read_thread,NULL,ComPort::slotReadThreadQPD,this)!=0)
//          {cerr <<"\nError - on create thread\n";};
        return true;
        break;
      case qsu:
        if (pthread_create(&read_thread,NULL,ComPort::slotReadThreadQSU,this)!=0)
//          {cerr <<"\nError - on create thread\n";};
        return true;
............................................................................

но компилятор ругается :
comport.cpp: In member function `bool ComPort::Open(int, int, int, eParity,
bool, eProtocol)':
comport.cpp:62: error: no matches converting function `slotReadThreadQPD' to
type `void*(*)(void*)'
comport.h:68: error: candidates are: void* ComPort::slotReadThreadQPD(void*)
comport.cpp:67: error: no matches converting function `slotReadThreadQSU' to
type `void*(*)(void*)'
comport.h:70: error: candidates are: void* ComPort::slotReadThreadQSU(void*)
comport.cpp:72: error: no matches converting function `slotReadThreadNON' to
type `void*(*)(void*)'
comport.h:66: error: candidates are: void* ComPort::slotReadThreadNON(void*)


Глобальные функции запускаются нормально. Если описАть slotReadThreadNON, slotReadThreadQPD, slotReadThreadQSU , как static или friend , то эти ошибки пропадают, но, естественно, появляется куча других, связанных с вызовом методов ComPort из slotReadThreadNON, slotReadThreadQPD, slotReadThreadQSU.


Возможно ли вообще запускать метод объекта нитью ? А метод класса?  
Заранее спасибо!




Содержание

Сообщения в этом обсуждении
"можно ли запустить метод объекта нитью (thread) ?"
Отправлено gyn61 , 28-Мрт-06 23:30 
class ComPort : public QObject
{
          .....................
    bool Open(int lNumPort,int lSpeed, int lSize, eParity lParity, bool lStopBit, eProtocol lProtocol);
...........................................

    void* slotReadThreadNON();
    static void* slotReadThreadNON_S(void *ob) {
       return ((ComPotr *)ob)->slotReadThreadNON();
    }

    void* slotReadThreadQPD();
    static void* slotReadThreadQPD_S(void *ob) {
       return ((ComPotr *)ob)->slotReadThreadQPD();
    }

    void* slotReadThreadQSU();
    static void* slotReadThreadQSU_S(void *ob) {
       return ((ComPotr *)ob)->slotReadThreadQSU();
    }

.......................................

bool ComPort::Open(int lNumPort, int lSpeed, int lSize, eParity lParity, bool lStopBit, eProtocol lProtocol)
{

..............................................

    switch (lProtocol)
    {
      case qpd:
        if (pthread_create(&read_thread,NULL,slotReadThreadQPD_S,this)!=0)
          {cerr <<"\nError - on create thread\n";};
        return true;
        break;
      case qsu:
        if (pthread_create(&read_thread,NULL,slotReadThreadQSU_S,this)!=0)
          {cerr <<"\nError - on create thread\n";};
        return true;
............................................................................


"можно ли запустить метод объекта нитью (thread) ?"
Отправлено pyatak , 29-Мрт-06 23:47 
Спасибо ! небольшая поправка :

...........................................

       void* slotReadThreadNON(void*);
       static void* slotReadThreadNON_S(void *ob) {
        return ((ComPort *)ob)->slotReadThreadNON(ob);
        }
            
       void* slotReadThreadQPD(void*);
       static void* slotReadThreadQPD_S(void *ob) {
         return ((ComPort *)ob)->slotReadThreadQPD(ob);
        }
        
       void* slotReadThreadQSU(void*);
       static void* slotReadThreadQSU_S(void *ob) {
          return ((ComPort *)ob)->slotReadThreadQSU(ob);
       }

............................................................


"можно ли запустить метод объекта нитью (thread) ?"
Отправлено kir , 30-Мрт-06 13:03 

описать методы static

ps: man c++