2016-06-30 17 views
1

私は自分のアプリケーションをマルチスレッドにしたいと思っています。独立した2つの独立したスレッドを追加すると、ランタイムエラーメッセージが表示されます。私は解決策を見つけることができません。多分誰かが助けてくれるかもしれませんここでQt Guiアプリケーションで2つの独立した標準スレッド

は誤差画像https://postimg.org/image/aasqn2y7b/

threads.h

#include <thread> 
#include <atomic> 
#include <chrono> 
#include <iostream> 

class Threads 
{ 
public: 
    Threads() : m_threadOne(), m_threadTwo(), m_stopper(false) { } 

    ~Threads() { 
     m_stopper.exchange(true); 

     if (m_threadOne.joinable()) m_threadOne.join(); 
     if (m_threadTwo.joinable()) m_threadTwo.join(); 
    } 

    void startThreadOne() { 
     m_threadOne = std::thread([this]() { 
      while (true) { 
       if (m_stopper.load()) break; 

       std::cout << "Thread 1" << std::endl; 
       std::this_thread::sleep_for(std::chrono::seconds(1)); 
      } 
     }); 
    } 

    void startThreadTwo() { 
     m_threadOne = std::thread([this]() { 
      while (true) { 
       if (m_stopper.load()) break; 

       std::cout << "Thread 2" << std::endl; 
       std::this_thread::sleep_for(std::chrono::seconds(1)); 
      } 
     }); 
    } 

private: 
    std::thread m_threadOne; 
    std::thread m_threadTwo; 
    std::atomic<bool> m_stopper; 
}; 

mainwindow.h

#include "threads.h" 
#include <QMainWindow> 
#include "ui_mainwindow.h" 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0) : QMainWindow(parent), ui(new Ui::MainWindow), m_threads() { 
     ui->setupUi(this); 

     m_threads.startThreadOne(); 
     m_threads.startThreadTwo(); 
    } 

    ~MainWindow() { delete ui; } 

private: 
    Ui::MainWindow *ui; 
    Threads m_threads; 
}; 

main.cppに

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 
+0

エラーメッセージへのリンクが壊れています。メッセージをテキストとして投稿してください。 –

+0

私はsoultionではないと思いますが、あなたはmutexのない両方のスレッドでstd :: atomic m_stopperを共有しています。あなたのポストにコンソールログを入れてみてください – uelordi

+0

リンクが機能します。私はちょっと前にチェックした。 しかし、私はあなたにテキストを提供します: Microsoft Visual C++ランタイムライブラリ ランタイムエラー! –

答えて

5

あなたのスタートをランタイムにリンクですスレッド2が壊れています:

m_threadOne = std::thread([this]() { ... }); 

スレッド1を開始した後、m_thread_oneは別のスレッドを割り当てます。しかし、スレッド1は結合されていないので、終了します。

+1

コピー貼り付けがもう一度繰り返されます:-) – hyde

+0

ありがとう、今私は参照してください。私の間違いは、ここでm_threadTwoを使用しなければならなかった –

関連する問題