定时器使用问题

时间:2021-01-24 00:20:34
我在View类的OnCreate中加入一个定时器SetTimer(0,100,NULL),然后再View类的OnTimer函数中写入如下代码:
         for(int i=0;i<500;i++)
           for(int j=0;j<400;j++)
  {
     if(((i-100)*(i-100)+(j-120)*(j-120))<100*100)
       data[i][j]-=1;
  }
CMainFrame *pMainFrm=(CMainFrame *)AfxGetMainWnd();
CMDIChildWnd *pChild = pMainFrm->MDIGetActive();
CLAIBINView *pView=(CLAIBINView*)pChild->GetActiveView();
if(maploadok)
pView->mapopen((data[i][j]));
其中数组data[i][j]的值表示不同直线的长度,if语句是用来判断一个圆形区域,以data[100][120]为圆心,半径为100的圆面。data[i][j]-=1相当于使整个圆面减少同样的高度1,这不是我想要的效果。我希望是圆心那点的值减少最多,随着逐渐向外扩展减少的值逐渐变小,相当于一个漏斗的样子。我需要怎样对data[i][j]操作才达到上述效果,并且用一个定时器使之以动态的过程形成类似于漏斗状。

21 个解决方案

#1


参考“伽吗校正”

#2


   for(int i=0;i<500;i++)
           for(int j=0;j<400;j++)
  {
     if(((i-100)*(i-100)+(j-120)*(j-120))<100*100)
       data[i][j]-=1;
  }
循环,还可以在多几次吗?????
这种代码,写在定时器里干什么。
这个开线程处理呀。

定时器,要确保代码尽量短,运行时间尽可能的短。
不然,你的界面响应,就会被阻塞。

#3


2楼能详细点介绍你的看法不

#4


引用 1 楼 zhao4zhong1 的回复:
参考“伽吗校正”

哪里有介绍“伽吗校正”呢

#5


长时间的计算,开定时器一定会阻塞的。
应该启动线程计算。
如果需要在定时器里启动线程也行。

不过如果计算时间很长,无论怎么处理,任务都会积累下去。
最好根据需要计算,有些不必计算的就节省了。

比如你这里,如果是定时器开线程计算时,上次开的线程,还在计算,新线程就不必开了。
否则开线程计算,计算结束,结果通过消息,post 到主窗体显示。

如果,结果不是必须得到的,而时间非常重要,可以先结束前一个线程;
重新在新的时间点开线程计算。

#6


多线程吧!!

#7


可以用大圆减逐步扩大的圆面积为计量

#9


引用 7 楼 focuslight 的回复:
可以用大圆减逐步扩大的圆面积为计量

能详细一点不

#10


引用 5 楼 lm_whales 的回复:
长时间的计算,开定时器一定会阻塞的。
应该启动线程计算。
如果需要在定时器里启动线程也行。

不过如果计算时间很长,无论怎么处理,任务都会积累下去。
最好根据需要计算,有些不必计算的就节省了。

比如你这里,如果是定时器开线程计算时,上次开的线程,还在计算,新线程就不必开了。
否则开线程计算,计算结束,结果通过消息,post 到主窗体显示。

如果,结果不是必须得到的,而时间非常重要,可以先结束前一个线程;
重新在新的时间点开线程计算。

那我得了解一下线程

#11


引用 8 楼 zhao4zhong1 的回复:
Quote: 引用 1 楼 zhao4zhong1 的回复:

参考“伽吗校正”

http://www.baidu.com/s?wd=%E4%BC%BD%E5%90%97%E6%A0%A1%E6%AD%A3&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=2&rsv_sug1=2&rsv_sug4=0&inputT=13750

貌似没有多大关系吧

#12


引用 11 楼 u010194077 的回复:
Quote: 引用 8 楼 zhao4zhong1 的回复:

Quote: 引用 1 楼 zhao4zhong1 的回复:

参考“伽吗校正”

http://www.baidu.com/s?wd=%E4%BC%BD%E5%90%97%E6%A0%A1%E6%AD%A3&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=2&rsv_sug1=2&rsv_sug4=0&inputT=13750

貌似没有多大关系吧

y=x (x=0..1,y=0..1) 线性关系。

          γ
y=x (x=0..1,y=0..1) 带伽马γ校正的对应关系。

再不济用等差数列或等比数列总行吧。

#13


我大概知道你的意思了,但是我要怎样让符合条件的数组值与x、y对应起来呢

#14


   for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

#15


函数f相当于伽马校正吧!这样会实现动态渐变的过程吗?

#16


引用 14 楼 zhao4zhong1 的回复:
   for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

我这样写
for(int i=10;i<300;i++)
for(int j=0;j<400;j++)
{
int d=((i-100)*(i-100)+(j-120)*(j-120));
if(d<100*100)
this->demdata->data[i][j]-=int(pow(data[i][j],0.45));
}

为什么当执行到满足条件的点时出现指针越界操作的错误,错误为
定时器使用问题

#17


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

#18


引用 17 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

好的,但是在ontimer里面加入
for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

应该是相当于每循环一次就暂停settimer里设置的延迟时间吧!这样的话程序会运行很慢,像卡死一样,最后还弹出内存不足的对话框,这个问题要怎样解决呢

#19


MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

#20


引用 19 楼 zhao4zhong1 的回复:
MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

SDK版本是哪个

#21


引用 20 楼 u010194077 的回复:
Quote: 引用 19 楼 zhao4zhong1 的回复:

MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

SDK版本是哪个

好象所有SDK版本里面都有GdiDemo

#1


参考“伽吗校正”

#2


   for(int i=0;i<500;i++)
           for(int j=0;j<400;j++)
  {
     if(((i-100)*(i-100)+(j-120)*(j-120))<100*100)
       data[i][j]-=1;
  }
循环,还可以在多几次吗?????
这种代码,写在定时器里干什么。
这个开线程处理呀。

定时器,要确保代码尽量短,运行时间尽可能的短。
不然,你的界面响应,就会被阻塞。

#3


2楼能详细点介绍你的看法不

#4


引用 1 楼 zhao4zhong1 的回复:
参考“伽吗校正”

哪里有介绍“伽吗校正”呢

#5


长时间的计算,开定时器一定会阻塞的。
应该启动线程计算。
如果需要在定时器里启动线程也行。

不过如果计算时间很长,无论怎么处理,任务都会积累下去。
最好根据需要计算,有些不必计算的就节省了。

比如你这里,如果是定时器开线程计算时,上次开的线程,还在计算,新线程就不必开了。
否则开线程计算,计算结束,结果通过消息,post 到主窗体显示。

如果,结果不是必须得到的,而时间非常重要,可以先结束前一个线程;
重新在新的时间点开线程计算。

#6


多线程吧!!

#7


可以用大圆减逐步扩大的圆面积为计量

#8


#9


引用 7 楼 focuslight 的回复:
可以用大圆减逐步扩大的圆面积为计量

能详细一点不

#10


引用 5 楼 lm_whales 的回复:
长时间的计算,开定时器一定会阻塞的。
应该启动线程计算。
如果需要在定时器里启动线程也行。

不过如果计算时间很长,无论怎么处理,任务都会积累下去。
最好根据需要计算,有些不必计算的就节省了。

比如你这里,如果是定时器开线程计算时,上次开的线程,还在计算,新线程就不必开了。
否则开线程计算,计算结束,结果通过消息,post 到主窗体显示。

如果,结果不是必须得到的,而时间非常重要,可以先结束前一个线程;
重新在新的时间点开线程计算。

那我得了解一下线程

#11


引用 8 楼 zhao4zhong1 的回复:
Quote: 引用 1 楼 zhao4zhong1 的回复:

参考“伽吗校正”

http://www.baidu.com/s?wd=%E4%BC%BD%E5%90%97%E6%A0%A1%E6%AD%A3&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=2&rsv_sug1=2&rsv_sug4=0&inputT=13750

貌似没有多大关系吧

#12


引用 11 楼 u010194077 的回复:
Quote: 引用 8 楼 zhao4zhong1 的回复:

Quote: 引用 1 楼 zhao4zhong1 的回复:

参考“伽吗校正”

http://www.baidu.com/s?wd=%E4%BC%BD%E5%90%97%E6%A0%A1%E6%AD%A3&rsv_bp=0&rsv_spt=3&ie=utf-8&rsv_sug3=2&rsv_sug1=2&rsv_sug4=0&inputT=13750

貌似没有多大关系吧

y=x (x=0..1,y=0..1) 线性关系。

          γ
y=x (x=0..1,y=0..1) 带伽马γ校正的对应关系。

再不济用等差数列或等比数列总行吧。

#13


我大概知道你的意思了,但是我要怎样让符合条件的数组值与x、y对应起来呢

#14


   for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

#15


函数f相当于伽马校正吧!这样会实现动态渐变的过程吗?

#16


引用 14 楼 zhao4zhong1 的回复:
   for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

我这样写
for(int i=10;i<300;i++)
for(int j=0;j<400;j++)
{
int d=((i-100)*(i-100)+(j-120)*(j-120));
if(d<100*100)
this->demdata->data[i][j]-=int(pow(data[i][j],0.45));
}

为什么当执行到满足条件的点时出现指针越界操作的错误,错误为
定时器使用问题

#17


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

#18


引用 17 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

好的,但是在ontimer里面加入
for(int i=0;i<500;i++)
            for(int j=0;j<400;j++)
   { int d2=((i-100)*(i-100)+(j-120)*(j-120));//d2为i,j到圆心的距离的平方
      if(d2<100*100) {
        data[i][j]-=f(sqrt((double)d2));//int f(double d);函数f返回与距离d相关的值,d越小,f越大
      }
   }

应该是相当于每循环一次就暂停settimer里设置的延迟时间吧!这样的话程序会运行很慢,像卡死一样,最后还弹出内存不足的对话框,这个问题要怎样解决呢

#19


MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

#20


引用 19 楼 zhao4zhong1 的回复:
MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

SDK版本是哪个

#21


引用 20 楼 u010194077 的回复:
Quote: 引用 19 楼 zhao4zhong1 的回复:

MDI动画参考
Microsoft SDK\samples\multimedia\Gdi\GdiDemo\*.*

SDK版本是哪个

好象所有SDK版本里面都有GdiDemo