2013-09-27 61 views
0

對於我的任務,我需要編寫一個多線程程序,在一個單獨的線程中輸出小於或等於用戶輸入的數字的所有素數。如何在window.h線程中聲明一個bool函數?

我是新來的線程,並沒有完全理解如何正確地實現它們。但是我創建了一個布爾函數來確定一個整數是否是一個素數,我將它命名爲bool isPrime。然而,布爾isPrime給我以下錯誤「聲明是不符合」LPVOID isPrime「。我不知道如何解決它,我也注意到,我的編譯器(visual c + +)給出了」cout「的紅色下劃線和「cin」,但如果我聲明使用命名空間標準,比編譯器強調「標準」,並給出這個錯誤「名稱必須是命名空間名稱」,我不知道它應該是什麼意思。我該如何解決這兩個問題?

#include <Windows.h> 

DWORD Prime; 


DWORD WINAPI primeThreadFun(LPVOID isPrime) 
{ 
    bool isPrime(int n) 
    {  
     float sqrtn = sqrt(n); 
     if (n < 2) return false; 
     if (n < 4) return true; 
     if (n % 2 == 0) return false; 
     for (int d = 3; d <= sqrtn; d += 2) 
     if (n % d == 0) return false; 
     return true; 
    } 

} 

int main(int argc, char *argv []) 
{ 
    DWORD ThreadId; 

    HANDLE ThreadHandle; 

    int n; 
    cout << "Enter a number: " << endl; 
    cin >> n; 
    for (int i = 0; i <= n; i++) 
    if (isPrime(i)) cout << i << " "; 
    cout endl; 
} 

ThreadHandle = CreateThread(NULL, 0, primeThreadFun, (LPVOID) isPrime, NULL, ThreadID []); 

if (ThreadHandle != NULL) 
{ 
    WaitForSingleObject(ThreadHandle INFINITE); 

    CloseHandle(ThreadHandle); 
} 

} 

回答

1

C/C++不支持嵌套函數 - 。isPrime嵌套在primeThreadFun 將其移出,並從primeThreadFun稱之爲

也,你有一個名爲全局變量「isPrime 「 - 你不能那樣做和全局函數 「isPrime()」

對於COUT你需要包括 「iostream的」

+0

如何將它移出並從primeThreadFun中調用它?所以,我應該包括使用命名空間標準,不是嗎? –

+0

如果我#include 它告訴我「無法打開源文件iostream.h」 –

+0

「iostream」沒有.h。 – joeking

0

首先,CreateThread需要一個特定的簽名(reference):

DWORD WINAPI ThreadProc(LPVOID lpParam); 

所以你的線程聲明將需要相同的簽名。

其次,你試圖做的不是分離線程的好方法。把線程想象成一個單獨的過程。它會完成一些任務,然後結束。

你需要做這樣的事情(注:下面沒有調試,只能作爲一個起點 - 因爲我不是在這裏做你的功課,你這是故意做):

struct MyData 
{ 
    std::vector<unsigned int> myVec; 
    unsigned int myCap; 
}; 

DWORD WINAPI MyThreadProc(LPVOID lpParam) 
{ 
    MyData* pData = (MyData*)lpParam; 
    for (int i = 4; i <= myCap; ++i) 
    { 
     int root = (int)std::sqrt(i); 
     bool isPrime = true; 
     for (int j = 2; j <= root; ++j) 
     { 
      if (i % j == 0) 
      { 
       isPrime = false; 
       break; 
      } 
     } 

     if (isPrime) 
     { 
      pData->myVec.push_back(i); 
     } 
    } 

} 

int main() 
{ 
    MyData data; 
    std::cin >> data.myCap; 
    HANDLE hThread = CreateThread(NULL, 0, MyThreadProc, &data, NULL, NULL); 
    std:: cout << "Finding Primes" << std::endl; 
    while (WaitForSingleObject(hThread, 1000) != WAIT_OBJECT_0) 
    { 
     std::cout << "."; 
    } 
    std::cout << std::endl; 
    std::copy(data.begin(), data.end(), std::ostream_iterator<unsigned int>(std::cout, " ")); 
    return 0; 
} 
+0

爲什麼使用struct MyData { std :: vector myVec; unsigned int myCap; }; 它應該做什麼? –

+0

這是給你的線程的對象。它包含素數的向量和您在下面搜索的上限。你應該同步它,但是我把它留給了這個演示。 –

相關問題