2016-06-12 2 views
-3

C++でのスレッドを閉じるために助けが必要ボタン(Qt -> QPushButton)で、関数(pause())を呼び出し、runningfalseに設定する必要があります。は、私は、この条件でのスレッド内でループを行う必要がある

マイスレッドのコードは次のようになります。それはpause()メソッドがfalseにrunningを設定し、糸のループを停止することがある

class CServeurTcp; 

struct thread_param_client{ 
    CServeurTcp* cli; 
    SOCKET soc; 
    BluetoothThread *_bt; 
}; 

class CServeurTcp 
{ 
private: 
    SOCKET client; 
    int erreur, emis, recus; 
    bool running; 
    DWORD ClientThread(SOCKET, BluetoothThread*); 
    string salle; 

    Vigenere *cryp; 
    BluetoothThread *_bth; 

public: 
    CServeurTcp(string, unsigned short, string, BluetoothThread*); 
    ~CServeurTcp(); 
    int pause(); 

static DWORD WINAPI ThreadLauncher_client(void *p) 
{ 
    struct thread_param_client *Obj = reinterpret_cast<struct thread_param_client*>(p); 
    CServeurTcp *s = Obj->cli; 
    return s->ClientThread(Obj->soc,Obj->_bt); 
} 
}; 

、しかし:

DWORD CServeurTcp::ClientThread(SOCKET soc, BluetoothThread *_bt) 
{ 
    ifstream fichier("test.txt", ios::in); 
    string ligne, mess_crypt, donnees, cut; 
    int compteurReception = 0; 

    if(fichier) 
    { 
     while(running) 
     { 
      if((_bt->getReception() != 0)&&(compteurReception != _bt->getReception())) 
      { 
       compteurReception = _bt->getReception(); 

       getline(fichier, ligne); 
       cut = ligne.substr (0,12); 
       cryp->vigenere_crypter(cut,mess_crypt,"VIGE"); 
       donnees = salle + " - " + mess_crypt; 
       emis = send(soc, donnees.c_str(), strlen(donnees.c_str()), 0); 
       if(emis == SOCKET_ERROR) 
        Affiche_Erreurs(WSAGetLastError()); 
       else 
        cout << "Nombre de caracteres envoyes: " << strlen(donnees.c_str()) << endl; 
      } 
     Sleep(1000); 
     } 
     fichier.close(); 
    } 
    else 
    cout << endl << "Impossible d'ouvrir le fichier !" << endl; 

    ExitThread(0); 

    return 0; 
} 

ここではクラスでありますdid not work ... これを達成するにはどうすればいいですか?

(私はpause()を呼び出すときにそれを閉じるために糸のループを閉じる)

おかげ

+1

ミューテックスなどは知っていますか? – deviantfan

+0

絶対にそうではありません: – Adson

+4

次に、次に学ぶべきことが分かっています:)それはスレッドに関する問題の1つです。 – deviantfan

答えて

4

runningは、原子やミューテックスで保護されていないので、複数のスレッドからアクセスすることは安全で、あなたのプログラムではありませんデータの競合があるため、その動作は定義されておらず、その結果については何も仮定することはできません。

+0

申し訳ありませんが、あなたが意味することを本当に分かりません:s 私のプログラムはサーバであり、*実行中の* attributは私がそれを停止したときにサーバをきれいに停止させることができます。 実際には、ループの終了を待機します。 – Adson

+1

次に、C++メモリモデルとstd :: atomicおよびstd :: mutexを読み込みます。 –

関連する問題