用C# 调用winAPI的 settimer()后,不执行回调函数!! 具体程序如下:

sanjin240 2008-12-17 05:24:50
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace APITimerForm
{
class timer
{
}
class TimerCallbackTest
{

private delegate void TimerProc(IntPtr hWnd, uint nMsg, int nIDEvent, int dwTime);

[DllImport("user32 ")]
private static extern int SetTimer(IntPtr hwnd, int nIDEvent, int uElapse, TimerProc CB);
[DllImport("user32 ")]
private static extern int KillTimer(IntPtr hwnd, int nIDEvent);

private int ID_CB_Timer = 0;
private int Cnt_CB_Timer = 0;
private TimerProc Cb = null;
private string _s = string.Empty;

public void startTimer(string s)
{

Cb = new TimerProc(this.OnTickTimer);
_s=_s + s + "/";
ID_CB_Timer = SetTimer(IntPtr.Zero, 0, 10, Cb);
}

public void stopTimer(ref string s)
{

s = _s;
KillTimer(IntPtr.Zero, this.ID_CB_Timer);
}

private void OnTickTimer(IntPtr hWnd, uint nMsg, int nIDEvent, int dwTime)
{
++Cnt_CB_Timer;
_s =_s+"/"+Cnt_CB_Timer+"over";
}
}

}


调用程序 另一个窗体中
private void btmOK_Click(object sender, EventArgs e)
{
TimerCallbackTest t = new TimerCallbackTest();
string s = richTextBox1.Text;
t.startTimer(s);
Thread.Sleep(200);
t.stopTimer(ref s);
richTextBox1.Text = s;
}

希望大家试试!
...全文
209 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
起来!
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
用API的时候,还要引用什么东西吗
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
好像代理都是不带参数的传的吧!
我这么写了参数,就是提示错误!
dayizhixiaotutu 2008-12-17
  • 打赏
  • 举报
回复
Cb = new TimerProc(this.OnTickTimer);
调用cb的时候 cb里要有和
private void OnTickTimer(IntPtr hWnd, uint nMsg, int nIDEvent, int dwTime)
{
++Cnt_CB_Timer;
_s =_s+"/"+Cnt_CB_Timer+"over";
}

方法一样的参数

偶这样想的
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
在初始化Cb的时候我已经把函数OnTickTimer 传给Cb了啊!
还要传其他的吗?
dayizhixiaotutu 2008-12-17
  • 打赏
  • 举报
回复
调用这个Cb 的时候要向里边传参数吧
hangang7403 2008-12-17
  • 打赏
  • 举报
回复
up
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
startTimer(s);
stopTimer(ref s);
这两个函数的参数去了 也不行!
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
to heyu1000
加上了 还是不行!
heyu1000 2008-12-17
  • 打赏
  • 举报
回复
感觉应该是线程同步的问题,richTextBox1按钮与你程序不在一个线程,
在btmOK_Click中加上
if (this.InvokeRequired)
{
this.Invoke(new EventHandler(this.btmOK_Click), new object[] { sender,e});
return;
}

再看看
ooily 2008-12-17
  • 打赏
  • 举报
回复
不懂,up
sanjin240 2008-12-17
  • 打赏
  • 举报
回复
private void OnTickTimer(IntPtr hWnd, uint nMsg, int nIDEvent, int dwTime)
{}
这个函数不执行

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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