Мне нужно создать простую программу на Фортране, которая будет связана со сложной программой Qt.
Единственная проблема, с которой я сталкиваюсь - это использование QTimer
(что является обязательным): когда я вызываю функцию, используя QTimer
из Fortran, я всегда получаю это сообщение об ошибке:
QObject :: startTimer: QTimer можно использовать только с потоками, запущенными с QThread.
Все остальные «сложные» вещи (QUdpSocket
, использование классов ..) работают правильно.
Как я мог решить эту проблему? После сообщения об ошибке я думаю, что должен найти способ использовать QThread
для Фортрана, но я не знаю, как это сделать. (Я также пытался унаследовать пустышку от QThread
вместо QObject
: тоже не работает)
Вот простой пример. Я даю теперь вывод и после, исходный код.
вывод при непосредственном запуске программы C ++ / Qt
begin
hello
end
hello
hello
... // one "hello" per second
вывод при запуске программы f90
begin
QObject::startTimer: QTimer can only be used with threads started with QThread
end
main.cpp
#include <QApplication>
#include <QtGui>
#include "dummyclass.hpp"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
DummyClass*ds = new DummyClass();
Q_UNUSED(ds);
return app.exec();
}
dummyclass.hpp
#include <QTimer>
#include <QObject>
#include <QApplication>
#include <QTextStream>
class dummyclass : public QObject // public QThread
{
Q_OBJECT
public:
DummyClass();
private:
QTimer timer;
private slots:
void hello();
}
dummyclass.cpp
#include "dummyclass.hpp"
DummyClass::DummyClass()
{
QTextStream(stdout) << "begin" << endl;
connect(&timer, SIGNAL(timeout()), this, SLOT(hello()));
timer.start(1000);
QTextStream(stdout) << "endl" << endl;
}
void DummyClass::hello()
{
QTextStream(stdout) << "Hello !" << endl;
}
dummymain.f90
program dummy_main
use dummy_module
use, intrinsic :: ISO_C_Binding, only: C_CHAR, C_NULL_CHAR
type(dummy_type) :: dummy
call newDummy(dummy)
end program dummy_main
dummy_module.f90
module dummy_module
use, intrinsic :: ISO_C_Binding, only: C_CHAR, C_NULL_CHAR
use, intrinsic :: ISO_C_Binding, only: C_ptr, C_NULL_ptr
implicit none
private
type dummy_type
private
type(C_ptr) :: object = C_NULL_ptr
end type dummy_type
!------------------------
! C function declarations
!------------------------
interface
function C_dummyClass__new_ () result(this) bind(C,name="dummyClass__new_")
import
type(C_ptr) :: this
end function C_dummyClass__new_
subroutine C_dummyClass__delete_ (this) bind(C,name="dummyClass__delete_")
import
type(C_ptr), value :: this
end subroutine C_dummyClass__delete_
end interface
interface newDummy
module procedure newDummy__new
end interface newDummy
interface deleteDummy
module procedure dummyClass__delete
end interface deleteDummy
public :: newDummy, deleteDummy
!------------------------------------------------------------------------------
CONTAINS
!------------------------------------------------------------------------------
!-------------------------------------------------
! Fortran wrapper routines to interface C wrappers
!-------------------------------------------------
subroutine dummyClass__new(this)
type(dummy_type), intent(out) :: this
this%object = C_dummyClass__new_()
end subroutine dummyClass__new
subroutine dummyClass__delete(this)
type(dummy_type), intent(inout) :: this
call C_dummyClass__delete_(this%object)
this%object = C_NULL_ptr
end subroutine dummyClass__delete
!------------------------------------------------------------------------------
end module dummy_module
сборник
g++ -fPIC -Wall -Wextra -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -lQtGui -lQtCore -lQtNetwork -lpthread -I/usr/include/QtGui -I/usr/include/Qt -I/usr/include/QtCore -I/usr/include/QtNetwork -c *.cpp
gfortran -c *.f90
gfortran -Wall -Wextra -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -lQtGui -lQtCore -lQtNetwork -lpthread -I/usr/include/QtGui -I/usr/include/Qt -I/usr/include/QtCore -I/usr/include/QtNetwork -o dummy *.o /home/me/build/dummy/src/moc_dummy_class_.cxx -lstdc++
(примечание: файл moc для фиктивного класса уже был сгенерирован QtCreator)