Привет!
Имеется прога портированная из Windows в которой в главном потоке создается
форма (FORM) с кнопкой.
При нажатии на кнопку (b_start) запускается длительная операция (on_b_start_clicked()).
В этом обработчике on_b_start_clicked показывается форма с отменой операции в виде QDialog с кнопкой QPushButton - b_cancel, которая создается в томже главном потоке при создании FORM.
При нажатии на кнопку b_cancel->b_stop устанавливается флаг отмены flag_stop и
завершается выполнеие on_b_start_clicked().
Если убрать QCoreApplication::processEvents(QEventLoop::AllEvents ), то b_cancel
пререстает реагировать. До этого под Windows b_cance создавалась в отдельном потоке
on_b_start_clicked_theread и все работало без вызовов
QCoreApplication::processEvents(QEventLoop::AllEvents ).
Можно ли обойтись без QCoreApplication::processEvents(QEventLoop::AllEvents ) ?
class FORM: public QWidget
{
Q_OBJECT
public:
QPushButton *b_start;
CANCEL_BTN *b_cancel;
volatile int *flag_stop;
~FORM();
FORM(QWidget *parent);
public slots:
void on_b_start_clicked();
};
...
void FORM::on_b_start_clicked()
{
int sch = 0;
*flag_stop = false;
b_start->setEnabled(false);
b_cancel->show();
QCoreApplication::processEvents(QEventLoop::AllEvents );
//pthread_create(&ar_theread_handle,0, on_b_start_clicked_theread, this);
QCoreApplication::processEvents(QEventLoop::AllEvents );
while (!(*flag_stop))
{
Sleep(1000); //Тут длительная операция
sch++;
QCoreApplication::processEvents(QEventLoop::AllEvents );
if (sch >10)
break;
}
*flag_stop = true;
//while (!pthread_join(ar_theread_handle,0));
ar_theread_handle = 0;
b_start->setEnabled(true);
}
class CANCEL_BTN: public QDialog
{
Q_OBJECT
public:
volatile int *flag_stop;
QPushButton *b_stop;
~CANCEL_BTN();
CANCEL_BTN(volatile int *flag_);
public slots:
void on_b_stop_clicked();
};