Russian Qt Forum
Ноябрь 23, 2024, 03:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вылет при чтении LPT порта в потоке  (Прочитано 4623 раз)
grOk
Гость
« : Февраль 23, 2011, 04:12 »

Доброго времени суток.

Помогите разобраться. Читаю в потоке LPT порт с помощью библиотеки inpout32.dll, результат вывожу в qDebug().
В режиме отладки программа выдает результат 5 раз затем вылетает.
В режиме релиза 2 раза, дальше бред, затем вылет:
Код:
Запускается D:\Develop\QT\TLPT-build-desktop\release\TLPT.exe...
255
255
-244
16696
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QObject::killTimers: timers cannot be stopped from another thread
D:\Develop\QT\TLPT-build-desktop\release\TLPT.exe завершился с кодом 3

lptport.h
Код:
#ifndef LPTPORT_H
#define LPTPORT_H
#include <QThread>
#include <QLibrary>

typedef short(*Inp32)(short portAddr);
typedef void(*Out32)(short portAddr, short data);

class LptPort: public QThread
{
    Q_OBJECT
public:
    LptPort();
    volatile bool workStatus;
public slots:
    void clickStart();
private:
    QLibrary * lib;
    Inp32 inp32;
    Out32 out32;
    void run();
};

#endif // LPTPORT_H

lptport.cpp
Код:
#include <QDebug>
#include <lptport.h>

LptPort::LptPort(){
    workStatus = false;
    lib = new QLibrary("inpout32");
    if(lib->load()){
        inp32 = (Inp32) lib->resolve("Inp32");
        out32 = (Out32) lib->resolve("Out32");
     }
}
void LptPort::clickStart()
{
    if(workStatus)
        workStatus = false;
    else if(lib->isLoaded()){
         workStatus = true;
         start();
    }
}
void LptPort::run()
{
    while(workStatus){
        qDebug() << inp32(0x378);
        msleep(1000);
    }
}


P.S. Система: Qt Creator 2.0.1, Qt 4.7.0, Win7 32bit
Записан
BRE
Гость
« Ответ #1 : Февраль 23, 2011, 09:49 »

Зануляй указатели на функции при конструировании, и проверяй резольвились ли они реально (после resolve).
Записан
grOk
Гость
« Ответ #2 : Февраль 23, 2011, 11:26 »

Добавил обнуление и проверку.
lptport.h
Код:
LptPort::LptPort(){
    workStatus = false;
    inp32 = 0;
    out32 = 0;
    lib = new QLibrary("inpout32");
    if(lib->load()){
        inp32 = (Inp32) lib->resolve("Inp32");
        out32 = (Out32) lib->resolve("Out32");
        if(inp32)//{;}
            qDebug() << "inp32 resolved";
        if(out32)//{;}
            qDebug() << "out32 resolved";
     }
}

Результат пишет 3 раза, затем вылет:
Код:
Запускается D:\Develop\QT\TLPT-build-desktop\release\TLPT.exe...
inp32 resolved
out32 resolved
255
255
255
D:\Develop\QT\TLPT-build-desktop\release\TLPT.exe завершился с кодом -1073741819

Что заметил. Если в конструкторе убрать вывод qDebug, то результат как в первом посте.
Если писать и считывать порт по нажатию кнопки, то все работает, а вот прослушка в потоке не получается.
Видимо что-то с памятью происходит.
Записан
grOk
Гость
« Ответ #3 : Февраль 23, 2011, 11:53 »

Кажется нашел.
добавил _stdcal в typedef
Код:
typedef short _stdcall (*Inp32)(short portAddr);
typedef void _stdcall (*Out32)(short portAddr, short data);
пока работает
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.21 секунд. Запросов: 21.