CBrother 多线程

CBrother中的多线程是实实在在的多线程,它没有任何全局锁来限制线程的运行时间,在多核CPU的普及的今天,CBrother的多线程性能一定能满足你更多的需求

线程的创建

CBrother通过CreateThread方法创建多线程

  1. function MulThreadFunc(parm)
  2. {
  3. print "MulThreadFunc parm:" + parm;
  4. }
  5. function main(parm)
  6. {
  7. CreateThread(MulThreadFunc,1); //第一个参数是函数,第二个参数是传递的参数
  8. CreateThread(MulThreadFunc,2);
  9. }

结果:

  1. MulThreadFunc parm:1
  2. MulThreadFunc parm:2

线程同步 Lock

多线程同时修改同一个数据,只有一个线程会修改成功,其他线程将抛出SyncException

故多线程修改同一个数据的时候一定要用Lock类来做线程之间的同步

  1. var myLock = new Lock();
函数描述
lock 加锁,其他线程再次加锁会阻塞
unlock 解锁之后其他线程才可以获得锁权

例子:

  1. var g_count = 0;
  2. var g_lock = new Lock();
  3. function MulThreadFunc(parm)
  4. {
  5. for(var i = 0 ; i < 10 ; i++)
  6. {
  7. g_lock.lock();
  8. g_count++;
  9. print "MulThreadFunc parm:" + parm + " g_count:" + g_count;
  10. g_lock.unlock();
  11. }
  12. }
  13. function main(parm)
  14. {
  15. CreateThread(MulThreadFunc,1);
  16. CreateThread(MulThreadFunc,2);
  17. while(g_count != 20)
  18. {
  19. Sleep(1000);
  20. }
  21. }

结果:

  1. MulThreadFunc parm:1 g_count:1
  2. MulThreadFunc parm:2 g_count:2
  3. MulThreadFunc parm:1 g_count:3
  4. MulThreadFunc parm:2 g_count:4
  5. MulThreadFunc parm:2 g_count:5
  6. MulThreadFunc parm:1 g_count:6
  7. MulThreadFunc parm:2 g_count:7
  8. MulThreadFunc parm:1 g_count:8
  9. MulThreadFunc parm:1 g_count:9
  10. MulThreadFunc parm:2 g_count:10
  11. MulThreadFunc parm:2 g_count:11
  12. MulThreadFunc parm:2 g_count:12
  13. MulThreadFunc parm:2 g_count:13
  14. MulThreadFunc parm:2 g_count:14
  15. MulThreadFunc parm:1 g_count:15
  16. MulThreadFunc parm:2 g_count:16
  17. MulThreadFunc parm:1 g_count:17
  18. MulThreadFunc parm:1 g_count:18
  19. MulThreadFunc parm:1 g_count:19
  20. MulThreadFunc parm:1 g_count:20

Thread 类

CBrother提供了Thread类,它有定时器功能,也可以处理线程消息

函数描述用法
setThreadAction(action) 给thread添加一个action处理类对象,action类接口在下面讲 myThread.setThreadAction(action)
addTimer(ms,func,cnt) 添加一个心跳,每ms毫秒执行全局函数func,cnt为执行次数,cnt可以不传,缺省为-1,表示一直执行。线程启动前可以在外部调用,线程启动后只能在线程内部调用。 myThread.addTimer(1000,func);myThread.addTimer(1000,func,5);
addTimer(ms,clsobj,funcName,cnt) 添加一个心跳,每ms执行clsobj对象的funcName方法,cnt为执行次数,cnt可以不传,缺省为-1,表示一直执行。线程启动前可以在外部调用,线程启动后只能在线程内部调用。 myThread.addTimer(1000,clsobj,"test");myThread.addTimer(1000,clsobj,"test",5);
addMsg(msg) 给线程发送一条消息,会在action的onMsg方法里被处理,msg可以为任意对象 myThread.addMsg(msg);
start() 启动线程 myThread.start();
stop() 停止线程 myThread.stop();

thread对象销毁时,线程会停止。但如果thread对象被action对象引用,则线程不会停止。建议在不用线程的时候主动停止。

Thread响应Action类可以有如下接口

function onInit(),线程启动初始化。

function onEnd(),线程结束时。

function onMsg(msg),接收线程消息。

例子:

  1. class ThreadMsg
  2. {
  3. var msgid;
  4. }
  5. class ThreadAction
  6. {
  7. var thread;
  8. function ThreadAction(t)
  9. {
  10. thread = t;
  11. this.thread.addTimer(1000,this,"onHeart1");
  12. this.thread.addTimer(1000,this,"onHeart2",2);
  13. }
  14. function onInit()
  15. {
  16. print "thread init" ;
  17. }
  18. function onMsg(msg)
  19. {
  20. print "msg id:" + msg.msgid;
  21. }
  22. function onEnd()
  23. {
  24. print "thread end";
  25. }
  26. function onHeart1()
  27. {
  28. print "in action heart1";
  29. }
  30. function onHeart2()
  31. {
  32. print "in action heart2";
  33. }
  34. }
  35. class testHeart
  36. {
  37. function onTestHeart()
  38. {
  39. print "in testHeart";
  40. }
  41. }
  42. function TestTime()
  43. {
  44. print "in time1";
  45. }
  46. function TestTime2()
  47. {
  48. print "in time2";
  49. }
  50. function main(parm)
  51. {
  52. var thread = new Thread();
  53. thread.addTimer(1000,TestTime);
  54. thread.addTimer(1000,TestTime2,2);
  55. thread.addTimer(1000,new testHeart(),"onTestHeart");
  56. thread.setThreadAction(new ThreadAction(thread));
  57. thread.start();
  58. var i = 0;
  59. while(1)
  60. {
  61. Sleep(1000);
  62. var msg = new ThreadMsg();
  63. msg.msgid = i++;
  64. thread.addMsg(msg);
  65. if(i >= 5)
  66. {
  67. break;
  68. }
  69. }
  70. thread.stop();
  71. }

结果:

  1. thread init
  2. msg id:0
  3. in time1
  4. in time2
  5. in testHeart
  6. in action heart1
  7. in action heart2
  8. msg id:1
  9. in time1
  10. in time2
  11. in testHeart
  12. in action heart1
  13. in action heart2
  14. msg id:2
  15. in time1
  16. in testHeart
  17. in action heart1
  18. msg id:3
  19. in time1
  20. in testHeart
  21. in action heart1
  22. msg id:4
  23. thread end

Event 类

多线程编程中,经常需要某个线程在等待其它线程做完一些处理后才能继续执行。CBrother提供了Event类来做这样的事情。

  1. var myEvent = new Event();
函数描述用法
wait(outtime) 开始等待,outtimeh毫秒后超时,不传递outtime默认为0,表示不超时。一个Event对象只能等待一次,多次调用返回false表示等待失败 myEvent.wait();myEvent.wait(1000);
endWait(data) 通知Event结束等待,data为传递给Event的数据,可以不传递。一个Event对象在wait之后之能触发一次endWait,多次调用返回false表示结束失败 myEvent.endWait();myEvent.endWait("end");
isTimeOut() 结束等待后用来判断是正常结束还是超时结束。等待没结束之前调用没有意义。 var isOut = myEvent.isTimeOut();
getData() 等待结束后获取endWait传入的数据。等待没结束之前调用没有意义。 var data = myEvent.getData();

例子:

  1. var g_count = 0;
  2. var g_lock = new Lock();
  3. var g_Event = new Event();
  4. function MulThreadFunc(parm)
  5. {
  6. if(parm == 1)
  7. {
  8. print "wait in thread:" + parm;
  9. g_Event.wait(3000); //等待3秒
  10. print "wait end in thread:" + parm;
  11. }
  12. for(var i = 0 ; i < 10 ; i++)
  13. {
  14. g_lock.lock();
  15. g_count++;
  16. print "MulThreadFunc parm:" + parm + " g_count:" + g_count;
  17. g_lock.unlock();
  18. }
  19. if(g_Event.endWait())
  20. {
  21. print "endWait suc in thread:" + parm;
  22. }
  23. else
  24. {
  25. print "endWait faile in thread:" + parm;
  26. }
  27. }
  28. function main(parm)
  29. {
  30. CreateThread(MulThreadFunc,1);
  31. CreateThread(MulThreadFunc,2);
  32. while(g_count != 20)
  33. {
  34. Sleep(1000);
  35. }
  36. }

结果:

  1. wait in thread:1
  2. MulThreadFunc parm:2 g_count:1
  3. MulThreadFunc parm:2 g_count:2
  4. MulThreadFunc parm:2 g_count:3
  5. MulThreadFunc parm:2 g_count:4
  6. MulThreadFunc parm:2 g_count:5
  7. MulThreadFunc parm:2 g_count:6
  8. MulThreadFunc parm:2 g_count:7
  9. MulThreadFunc parm:2 g_count:8
  10. MulThreadFunc parm:2 g_count:9
  11. MulThreadFunc parm:2 g_count:10
  12. endWait suc in thread:2
  13. wait end in thread:1
  14. MulThreadFunc parm:1 g_count:11
  15. MulThreadFunc parm:1 g_count:12
  16. MulThreadFunc parm:1 g_count:13
  17. MulThreadFunc parm:1 g_count:14
  18. MulThreadFunc parm:1 g_count:15
  19. MulThreadFunc parm:1 g_count:16
  20. MulThreadFunc parm:1 g_count:17
  21. MulThreadFunc parm:1 g_count:18
  22. MulThreadFunc parm:1 g_count:19
  23. MulThreadFunc parm:1 g_count:20
  24. endWait faile in thread:1