2014-02-19 2 views
0

Я использую QtConcurrence для запуска функции в отдельном потоке, но я хочу остановить, приостановить или убить этот поток, но я не могу. Я прочитал это:Qt Programming - QtConcurrence kill thread

Обратите внимание, что QFuture возвращаемый QtConcurrent :: Run() не поддерживает отмену, приостановку или отчетности прогресса. Возвращенный QFuture может использоваться только для запроса состояния работы/завершения и возврата значения функции .

Могу ли я сделать это любым другим способом?

Моя функция:

void MainWindow::on_imprimirButton_clicked() 
{ 
     if(filename.length() == 0){ 
      ui->consolaBrowser->append("Error. Debe seleccionar un fichero."); 
     }else if(!filename.contains(".txt")){ 
      ui->consolaBrowser->append("Fichero erroneo. Debe seleccionar un archivo de tipo G-CODE."); 
     }else{ 

      imprimiendo=1; 

      *future= QtConcurrent::run(Imprimir,filename.toUtf8().data()); 

      imprimiendo=0; 
     } 
} 
+2

Вам не нужно «убивать» нить. Вам просто нужно установить флаг где-нибудь, из-за чего останавливается длительный процесс. – paulm

ответ

1

Я думаю, что решение QtConcurrence не очень приятно. Это часто предлагается, но не имеет преимущества перед хорошей реализацией с библиотекой потоков (например, QThread). В приведенном ниже примере показана одна возможность остановить поток. Если вы установите переменную m_bBreak true где-нибудь в своей основной программе, то поток остановится. Аналогичным образом вы также можете получить текущий поток.

int foo(bool* bStopper) { 
    if(*bStopper) 
    return 0; 

    // Do code here 

    return 1; 
} 

void QThread::run() { 
    m_iErrors = foo(&m_bBreak); 
    // Handle errors 
} 
+0

Вы также можете установить свойства 'qApp' в качестве флагов. Не нужно объявлять переменную. – user1095108

+0

Можете ли вы привести пример? – dgrat

+0

'qApp-> setProperty (" myFlag ", true)', проверьте свойство 'qApp-> (" myFlag "). ToBool()', вы должны '#include '. – user1095108