【问题标题】:Why am I getting run-time error为什么我会收到运行时错误
【发布时间】:2012-05-31 23:14:50
【问题描述】:

您好,我在 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);
           }
       }

    }

【问题讨论】:

  • kbhit() 已弃用,请改用_kbhit()。
  • @Alexander Bakulin:非常感谢您解决了这个问题。但只是想知道为什么_knhit() 为什么不kbhit()?
  • 取消删除我的答案的好机会 :) _kbhit() 据说(由 MSDN)是已弃用的 kbhit() 的替代品。我不知道这个决定背后的确切原因。请参阅我的答案以获取文档链接。
  • @Alexander Bakulin:链接在哪里?

标签: c operating-system pthreads codeblocks


【解决方案1】:

kbhit() 是 deprecated,请改用 _kbhit()。也许这就是原因。

【讨论】:

    【解决方案2】:

    您的程序存在未定义行为。
    不允许在 stdin 上调用 fflush(),这是一种未定义的行为。只允许在标准输出流stdout上调用。
    这可能是也可能不是您观察到的行为的直接原因,但由于它是您永远不知道的未定义行为...

    C99 标准 7.19.5.2/2:

    如果流指向一个输出流或更新流,其中没有输入最近的操作,则 fflush 函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义

    【讨论】:

    • 我调试发现不是fflush()的原因,是kbhit()的原因
    • @RasmiRanjanNayak:对你有好处 :)。但是,它仍然是一个无效程序。仅仅因为它有效并不能使它比现在更有效。
    猜你喜欢
    • 2017-10-20
    • 2010-09-15
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多