自定义CallBack函数,调用时立即返回

bobo463 2005-06-17 10:22:16
自定义一个回调函数,调用时,调用函数立即返回(不用等待CallBack执行完成,就像重叠IO中的重叠请求一样),不要线程实现。
------------------------------------
...全文
373 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobo463 2005-07-06
  • 打赏
  • 举报
回复
想到这个问题,对操作系统想了很久。突然发现对操作系统有了一点兴趣找了一些关于LINUX的文章看了看。发现上面的问题只有在操作系统内部实现(不使用用户现成的条件下)。现在想搞一个操作系统开发,大家也提一点意见啊!!
hdqqq 2005-07-01
  • 打赏
  • 举报
回复
我前两天正好写了一篇文章,讨论如何将 不同数量和不同类型参数的函数转换为函数子后,加入线程池非阻塞调用,不过用的是线程池实现的。有兴趣的人可以查看。

http://blog.csdn.net/hdqqq/archive/2005/06/29/407674.aspx

文中使用的是vc6 sp6 + lokivcport 库,有兴趣的人可以用vc创建一个使用标准库的控制台程序,然后将文章内容直接存为cpp文件后就可以测试运行,编译的时候需要用连接 libcmt库,需要在code generate 中设置使用 debug multi thread 或者multi thread 因为其中使用了 _beginthread函数。

欢迎大家参与讨论。

ihavenoidea 2005-07-01
  • 打赏
  • 举报
回复
不会吧 这不是并发吗~~
hdqqq 2005-07-01
  • 打赏
  • 举报
回复
我觉得这个问题考虑的关键,是程序运行的动力问题,不是说有了一段函数代码,我就可以不用任何代价的让它运行, 这个代价就是有一个 进程或者线程有cpu运行时间, 有一个运行栈,让这个函数运行. 否则,这个函数只是存在硬盘上的指令而已.
hdqqq 2005-07-01
  • 打赏
  • 举报
回复
回调函数在使用的时候实际上是传入的一个指针, 这个指针指向的函数并不是立即被调用的, 只是在需要的时候按照这个指针对进行回调,但是,关键的是,这个函数在那个进程中,或者线程中被调用,这个是函数得以运行的关键.


typedef void(*fun)(int a,char *s);
void testcallback(fun p,int a,char *s)
{
p(a,s);
}

....
调用
fun f;
void test(int a,char *s)
{
...
}

void main()
{
f=test;
testcallback(f,10,"this is test");
}

按照上面的代码,如果说testcallback(f,10,"this is test");是立即返回的,如果不用多线程,那么这个函数在那个进程中运行呢.它连被调用的机会都没有.我的建议是建立一个任务的线程池,可以向其中加入任何类型的函数作为任务让其运行,完成以后,这个线程池在回收可用的线程.

至于完成端口的实现,系统是如何实现的我不清楚,我估计是系统 对函数进行了回调, 但是, 操作系统也有自己的运行机会的. 所以回调函数得以运行.
beyondtkl 2005-06-30
  • 打赏
  • 举报
回复
那类似重叠IO中的完成例程,
void CALLBACK CompletionRoutine(……)。是如何实现的呢?

------------------

这是 OS 处理的.. 内部的处理 不可得知..如果谁也搞定了 绝对大牛!
timepalette 2005-06-30
  • 打赏
  • 举报
回复
那类似重叠IO中的完成例程,
void CALLBACK CompletionRoutine(……)。是如何实现的呢?

------------------



os 当然随便使用线程与同步, -- 它使用了你也不知道, 它也不会让你知道.

OS 即使不使用线程也有可能, 因为线程还不是OS管理的?它想怎么用CPU就怎么用CPU
jiangzhu20 2005-06-29
  • 打赏
  • 举报
回复
在学习!!!
bobo463 2005-06-28
  • 打赏
  • 举报
回复
那类似重叠IO中的完成例程,
void CALLBACK CompletionRoutine(……)。是如何实现的呢?
DanielWYO 2005-06-28
  • 打赏
  • 举报
回复

不用线程也要用消息或者什么有背后线程的东西, 否则能写出的话我还真佩服楼主了!

pubol 2005-06-27
  • 打赏
  • 举报
回复
你的意思是要实现两段代码的并发的执行,从操作系统的角度来讲,只有进程和线程才具有这一特性
bobo463 2005-06-27
  • 打赏
  • 举报
回复
我只是不想调用者不用被阻塞而已,但又不想用线程实现.
Wolf0403 2005-06-27
  • 打赏
  • 举报
回复
创建线程吧,或者直接 post 一个消息到已有的线程池中去
pubol 2005-06-24
  • 打赏
  • 举报
回复
搞不明白为什么要这么做
thesys 2005-06-24
  • 打赏
  • 举报
回复
明显违背逻辑。
调用者立即返回了去执行后面的代码,同时被调用函数也在执行自己函数内部的代码,这就只能是两个线程。
bobo463 2005-06-23
  • 打赏
  • 举报
回复
我需要它立即返回啊!各位大虾有没有方法实现啊!
qrlvls 2005-06-23
  • 打赏
  • 举报
回复
忌牵强附会 -_-!!!!
pubol 2005-06-22
  • 打赏
  • 举报
回复
可以的,回调函数产生的效果和事件是一样的,标准的c/c++是通过传递函数指针参数来实现的
c#中有现成的修饰词可以使用,我以前写过dll里实现回调,然后执行某个操作,自动触发调用程序的某个函数进行消息通信
beyondtkl 2005-06-22
  • 打赏
  • 举报
回复
不行吧,不用线程。。。调用函数 的堆栈 跟 回调函数的 在一起的呀(挨着)

除非你手工修改esp 不过修改了 可能回调函数就执行不到了之类的。。。
pubol 2005-06-22
  • 打赏
  • 举报
回复
刚才不小心按了发出了
重新写过
标准c/c++实现
typedef void(*fun)(int a,char *s);
void testcallback(fun p,int a,char *s)
{
p(a,s);
}

....
调用
fun f;
void test(int a,char *s)
{
...
}

void main()
{
f=test;
testcallback(f,10,"this is test");
}
加载更多回复(2)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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