Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Yegor от Январь 22, 2016, 15:04



Название: Определить, что цикл обработки сообщений запустился
Отправлено: Yegor от Январь 22, 2016, 15:04
Здравствуйте всем!

Думаю, что это распространенный вопрос.

У меня прога под Qt 4.8.6. Консольное приложение.
В main.cpp создаю, соединяю, инициализирую объекты. Объекты общаются друг с другом с помощью сигналов-слотов.
Некоторые соединения мне нужны обязательно с флагом с Qt::QueuedConnection.
Но сигналы - слоты, которые соединяются как Qt::QueuedConnection, начинают работать только после того, когда цикл обработки событий запущен (с помощью QCoreApplication::exec). До этого они не работают.

А как узнать, что QApplication::exec уже в работе?

Есть ли какое либо уведомление, сигнал, информирующий об этом?

Мне это уведомление необходимо, чтобы его перехватить, и запустить по нему слот, по которому запускается работа (логика) приложения.


Код
C++ (Qt)
// Main function.
int main(int argc, char *argv[])
{
   // App obj.
   QCoreApplication a(argc, argv);
 
   try
   {
       // Set app props.
       QCoreApplication::setApplicationName ( "myappname" );
 
       // Output obj.
       OutputData output;
       output.outputHead();
 
       // ** Read setting - name of local server to connect to.Begin. *************************
       const QString strSettingFilename = "myapp.ini";
       const QString strUnknownSetting = "unknown_name";
       QSettings setting ( qApp->applicationDirPath() + "/" + strSettingFilename, QSettings::IniFormat );
       const QString strServerName = setting.value ( "my_server/my_server-name", strUnknownSetting ).toString();
       if ( strServerName == strUnknownSetting )
           throw new CustomException ( "can't load local server name" );
       // ** Read setting - name of local server to connect to.End. ***************************
 
       // ** Get commands from cmd line.Begin. ******************
       const QStringList listCommands = a.arguments();
       if ( listCommands.count() <= 1 ) // Need to have at least 1 parameter. (Not including app filename, that is the first param).
           throw new CustomException ( "there are no parameters passed into this application" );
       // ** Get commands from cmd line.End. ********************
 
       // Smart Socket object.
       SmartSocket socket ( strServerName, listCommands );
 
       // Connections.Begin.
       // Redirecting information messages to console.
       if ( !QObject::connect ( &socket, SIGNAL ( notifyInfo_signal ( const QString& ) ), &output, SLOT ( outputData_slot ( const QString& ) ) ) )
           throw new CustomException ( "can't connect the mechanism of redirecting information messages from socket to console" );
       // Redirecting error messages to console.
       if ( !QObject::connect ( &socket, SIGNAL ( notifyError_signal ( const QString& ) ), &output, SLOT ( outputData_slot ( const QString& ) ) ) )
           throw new CustomException ( "can't connect the mechanism of redirecting error messages from socket to console" );
       // Quiting from app mechanism.
       if ( !QObject::connect ( &socket, SIGNAL ( exit_signal() ), &a, SLOT ( quit() ) ) )
           throw new CustomException ( "can't connect the quiting from app mechanism" );
       // Starting work mechanism.
       // Connections.End.
 
       // Start the work.
       socket.startWorking_slot();  [color=red][b]// Вот этот слот мне нужно запустить после a.exec(), a не до него[/b][/color]
 
       // Exec app.
       int retCode = a.exec();
 
       // Output exiting text.
       output.outputFoot();
 
       // Return from app.
       return retCode;
   }
   catch ( CustomException* e )
   {
       std::cout << "Error: " << e->getErrorString() << "." << std::endl
                 << "Exiting from " << qApp->applicationName().toStdString() << "." << std::endl;
       delete e;
   }
   catch (...)
   {
       std::cout << "Unknown error." << std::endl
                 << "Exiting from " << qApp->applicationName().toStdString() << "." << std::endl;
   }
 
   return 1; // Return from app whith error.
}
 


Название: Re: Определить, что цикл обработки сообщений запустился
Отправлено: Old от Январь 22, 2016, 15:30
Код
C++ (Qt)
QMetaObject::invokeMethod( &socket, "startWorking_slot" );
 


Название: Re: Определить, что цикл обработки сообщений запустился
Отправлено: Igors от Январь 22, 2016, 15:59
Попробуйте подсесть на сигнал QAbstractEventDispatcher::awake (первое срабатывание)