windows控制台的定时器

liuzu2016 2012-06-13 06:33:59
#include "stdafx.h"

#include <windows.h>
#include<iostream>

using std::cout;
using std::endl;
#define myID 1000

void CALLBACK myfun(HWND, UINT,UINT_PTR nEventID,DWORD)
{
if(nEventID==myID)
cout<<"nihao"<<endl;
}



int main()
{

char c;

c=getchar();

if(c=='a')
{
::SetTimer(NULL,myID,2000,myfun);
}

c=getchar();

return 0;

}




谁试试我的代码,不对啊,这个在控制台下的定时器不行啊

帮忙修改一下吧






...全文
244 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
寂寞vs爱神 2012-06-14
  • 打赏
  • 举报
回复
楼主需要自己加一个循环。不然实现不了定时的。
AnYidan 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

控制台的程序默认没有消息循环,得自己实现
[/Quote]

++
赵4老师 2012-06-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#include <io.h>
#include <process.h>
#define MYVOID void
#else
#include <unistd.h>
#include <sys/time.h>
#include <pthread.h>
#define CRITICAL_SECTION pthread_mutex_t
#define _vsnprintf vsnprintf
#define MYVOID void *
#endif
//Log{
#define MAXLOGSIZE 20000000
#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))
#include <time.h>
#include <sys/timeb.h>
#include <stdarg.h>
char logfilename1[]="MyLog1.log";
char logfilename2[]="MyLog2.log";
char logstr[16000];
char datestr[16];
char timestr[16];
char mss[4];
CRITICAL_SECTION cs_log;
FILE *flog;
#ifdef WIN32
void Lock(CRITICAL_SECTION *l) {
EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
LeaveCriticalSection(l);
}
void sleep_ms(int ms) {
Sleep(ms);
}
#else
void Lock(CRITICAL_SECTION *l) {
pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
pthread_mutex_unlock(l);
}
void sleep_ms(int ms) {
usleep(ms*1000);
}
#endif
void LogV(const char *pszFmt,va_list argp) {
struct tm *now;
struct timeb tb;


if (NULL==pszFmt||0==pszFmt[0]) return;
if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;
ftime(&tb);
now=localtime(&tb.time);
sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);
sprintf(timestr,"%02d:%02d:%02d",now->tm_hour ,now->tm_min ,now->tm_sec );
sprintf(mss,"%03d",tb.millitm);
printf("%s %s.%s %s",datestr,timestr,mss,logstr);
flog=fopen(logfilename1,"a");
if (NULL!=flog) {
fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);
if (ftell(flog)>MAXLOGSIZE) {
fclose(flog);
if (rename(logfilename1,logfilename2)) {
remove(logfilename2);
rename(logfilename1,logfilename2);
}
flog=fopen(logfilename1,"a");
if (NULL==flog) return;
}
fclose(flog);
}
}
void Log(const char *pszFmt,...) {
va_list argp;

Lock(&cs_log);
va_start(argp,pszFmt);
LogV(pszFmt,argp);
va_end(argp);
Unlock(&cs_log);
}
//Log}
int No_Loop=0;
MYVOID testThread(void *pcn) {
int n,i;

n=(int)pcn;
i=0;
while (1) {
sleep_ms(1000);
Log("in testThread %d:i==%ds\n",n,++i);
if (i>=5) No_Loop=1;
}
}
int main(int argc,char * argv[]) {
int i;
#ifdef WIN32
InitializeCriticalSection(&cs_log);
#else
pthread_mutex_init(&cs_log,NULL);
pthread_t threads[1];
int threadsN;
int rc;
#endif
Log("=========BEGIN==================\n");
#ifdef WIN32
_beginthread((void(__cdecl *)(void *))testThread,0,(void *)1);
#else
threadsN=0;
rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);
#endif
i=0;
while (1) {
sleep_ms(100);
Log("in main:i==%d\n",++i);
if (No_Loop==1) break;//
}
Log("=========END====================\n");
#ifdef WIN32
DeleteCriticalSection(&cs_log);
#else
pthread_mutex_destroy(&cs_log);
#endif
return 0;
}
//2012-06-14 16:27:21.500 =========BEGIN==================
//2012-06-14 16:27:21.609 in main:i==1
//2012-06-14 16:27:21.718 in main:i==2
//2012-06-14 16:27:21.828 in main:i==3
//2012-06-14 16:27:21.937 in main:i==4
//2012-06-14 16:27:22.046 in main:i==5
//2012-06-14 16:27:22.156 in main:i==6
//2012-06-14 16:27:22.265 in main:i==7
//2012-06-14 16:27:22.375 in main:i==8
//2012-06-14 16:27:22.484 in main:i==9
//2012-06-14 16:27:22.500 in testThread 1:i==1s
//2012-06-14 16:27:22.593 in main:i==10
//2012-06-14 16:27:22.703 in main:i==11
//2012-06-14 16:27:22.812 in main:i==12
//2012-06-14 16:27:22.921 in main:i==13
//2012-06-14 16:27:23.031 in main:i==14
//2012-06-14 16:27:23.140 in main:i==15
//2012-06-14 16:27:23.250 in main:i==16
//2012-06-14 16:27:23.359 in main:i==17
//2012-06-14 16:27:23.468 in main:i==18
//2012-06-14 16:27:23.500 in testThread 1:i==2s
//2012-06-14 16:27:23.578 in main:i==19
//2012-06-14 16:27:23.687 in main:i==20
//2012-06-14 16:27:23.796 in main:i==21
//2012-06-14 16:27:23.906 in main:i==22
//2012-06-14 16:27:24.015 in main:i==23
//2012-06-14 16:27:24.125 in main:i==24
//2012-06-14 16:27:24.234 in main:i==25
//2012-06-14 16:27:24.343 in main:i==26
//2012-06-14 16:27:24.453 in main:i==27
//2012-06-14 16:27:24.500 in testThread 1:i==3s
//2012-06-14 16:27:24.562 in main:i==28
//2012-06-14 16:27:24.671 in main:i==29
//2012-06-14 16:27:24.781 in main:i==30
//2012-06-14 16:27:24.890 in main:i==31
//2012-06-14 16:27:25.000 in main:i==32
//2012-06-14 16:27:25.109 in main:i==33
//2012-06-14 16:27:25.218 in main:i==34
//2012-06-14 16:27:25.328 in main:i==35
//2012-06-14 16:27:25.437 in main:i==36
//2012-06-14 16:27:25.500 in testThread 1:i==4s
//2012-06-14 16:27:25.546 in main:i==37
//2012-06-14 16:27:25.656 in main:i==38
//2012-06-14 16:27:25.765 in main:i==39
//2012-06-14 16:27:25.875 in main:i==40
//2012-06-14 16:27:25.984 in main:i==41
//2012-06-14 16:27:26.093 in main:i==42
//2012-06-14 16:27:26.203 in main:i==43
//2012-06-14 16:27:26.312 in main:i==44
//2012-06-14 16:27:26.421 in main:i==45
//2012-06-14 16:27:26.500 in testThread 1:i==5s
//2012-06-14 16:27:26.531 in main:i==46
//2012-06-14 16:27:26.531 =========END====================
Gloveing 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

大牛,你的这个法子和别人不一样

能提供代码吗??

我想试试你的思路

引用 6 楼 的回复:

CreateThread
在Thread函数里面Sleep
访问全局变量要加锁。
[/Quote]
创建一个新线程来定时,其实如果是控制台的程序,最简单的当然就是楼上的:Sleep(1000)
Lactoferrin 2012-06-14
  • 打赏
  • 举报
回复
#include <stdio.h>
#include<windows.h>
int main()
{
while(1)
{
puts("fuck");
Sleep(1000);
}
return 0;
}
liuzu2016 2012-06-14
  • 打赏
  • 举报
回复
大牛,你的这个法子和别人不一样

能提供代码吗??

我想试试你的思路

[Quote=引用 6 楼 的回复:]

CreateThread
在Thread函数里面Sleep
访问全局变量要加锁。
[/Quote]
liuzu2016 2012-06-14
  • 打赏
  • 举报
回复


按照你的修改,已经ok了

有些郁闷的就是:加消息循环,那么必然得修改入口函数,main

改成:WinMain,然后在窗口函数中swtich(nMsg)
{
case WM_TIMER:

{
}

case other:

} //end swtich

WinMain里必须创建一个 窗口,可是我不想创建, 不知道能行吗?


可以修改入口函数,在入口函数中写代码,

不想创建窗口








[Quote=引用 8 楼 的回复:]

引用 5 楼 的回复:

你好,请问你这段代码赛到哪里啊?


第二个问题:

有的人说因为没有消息循环导致错误

为什么 有时候调用一个api,比如:CreateDirectory的时候不需要什么管什么消息循环

而有时候又需要,这是怎么回事啊??

在者:有的WinMain里的代码是: ::MessageBox 就可以了,不搞消息循环,窗口函数

没有用Mes……
[/Quote]
Lactoferrin 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你好,请问你这段代码赛到哪里啊?


第二个问题:

有的人说因为没有消息循环导致错误

为什么 有时候调用一个api,比如:CreateDirectory的时候不需要什么管什么消息循环

而有时候又需要,这是怎么回事啊??

在者:有的WinMain里的代码是: ::MessageBox 就可以了,不搞消息循环,窗口函数

没有用MessageBox,就必须加窗口处理……
[/Quote]
SetTimer需要消息循环,我给的不需要,放哪都行
liuzu2016 2012-06-14
  • 打赏
  • 举报
回复
跟线程有什么关系啊?

定时器和线程无关啊

怎么回事啊


[Quote=引用 6 楼 的回复:]

CreateThread
在Thread函数里面Sleep
访问全局变量要加锁。
[/Quote]
赵4老师 2012-06-14
  • 打赏
  • 举报
回复
CreateThread
在Thread函数里面Sleep
访问全局变量要加锁。
liuzu2016 2012-06-14
  • 打赏
  • 举报
回复
你好,请问你这段代码赛到哪里啊?


第二个问题:

有的人说因为没有消息循环导致错误

为什么 有时候调用一个api,比如:CreateDirectory的时候不需要什么管什么消息循环

而有时候又需要,这是怎么回事啊??

在者:有的WinMain里的代码是: ::MessageBox 就可以了,不搞消息循环,窗口函数

没有用MessageBox,就必须加窗口处理函数。。





[Quote=引用 2 楼 的回复:]

while(1)
{
...
Sleep(2000);
}
[/Quote]
Lactoferrin 2012-06-13
  • 打赏
  • 举报
回复
while(1)
{
...
Sleep(2000);
}
Gloveing 2012-06-13
  • 打赏
  • 举报
回复
控制台的程序默认没有消息循环,得自己实现

69,322

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧