2012-05-25 45 views
2

你好我在Windows XP中使用Code :: Blocks。 當我運行這個程序時,我得到一個運行時錯誤爲"drawing operation was attempted when there was no current window". 我想知道爲什麼會這樣發生。爲什麼我得到運行時錯誤

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <windows.h> 
#include <conio.h> 
void *print_message_function(void *ptr); 

main() 
{ 
    pthread_t thread1, thread2; 
    char *message1 = "Thread 1"; 
    char *message2 = "Thread 2"; 
    int iret1, iret2; 

    iret1 = pthread_create(&thread1, NULL, print_message_function, (void*) message1); 
    iret2 = pthread_create(&thread2, NULL, print_message_function, (void*) message2); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    printf("Thread 1 returns: %d\n",iret1); 
    printf("Thread 2 returns: %d\n",iret2); 

    exit(0); 
} 

void *print_message_function(void *ptr) 
{ 
    char *message; 
    char hello; 
    for(;;) 
    { 
     message = (char *) ptr; 
     printf("%s \n", message); 
     Sleep(1000); 
     // break; 


     fflush(stdin); 
/*drawing operation was attempted when there was no current window*/ 
//The happens from next line onwords 
      if(kbhit()) 
      { 
       hello = getchar(); 
       printf("The interrupt %d", hello); 
      } 
     } 

    } 
+1

'kbhit()'已棄用,請改用'_kbhit()'。 –

+0

@亞歷山大巴庫林:非常感謝您解決這個問題。但只是想知道爲什麼'_knhit()'爲什麼不'kbhit()'? –

+0

很好的機會取消刪除我的答案:)'_kbhit()'被稱爲(由MSDN)替代棄用的'kbhit()'。我不知道這個決定背後的確切原因。查看我的答案鏈接到文檔。 –

回答

3

kbhit()deprecated,使用_kbhit()代替。也許這是原因。

4

您的程序有一個未定義的行爲
不允許在stdin上調用fflush(),這是一個未定義的行爲。只允許在標準輸出流stdout上調用。
這可能是也可能不是你所觀察的行爲的直接原因,但因爲它是你永遠不知道的未定義行爲...

C99標準7.19.5.2/2:

如果流指向輸出流或未輸入最近操作的更新流,則fflush函數會將該流的所有未寫入數據傳遞到主機環境以寫入文件;否則,行爲未定義

+0

我打了個屁,發現它不是因爲'fflush()',它是因爲kbhit()' –

+0

@RasmiRanjanNayak:對你有用:)但是,它仍然是一個無效的程序。只是因爲它的工作原理沒有讓它比現在更有效。 –

相關問題