获得多任务支持

 

1:需将工作目录中的“Config.Sys”文件中的“System”段中的“MultiTask”键值改为“TRUE”,内核启动时将“挂接”时钟中断-INT8,并修改定时器0的初始计数值为2048, 系统会每55/32 = 1.72mS调度一个任务,任务调度时若当前任务正在“DOS忙”,则系统不切换任务,故在多任务状态时,尽量调用没有使用INT21中断的函数。

[System]

MultiTask = TRUE

2:在Main主函数中,向系统注册“多任务MultiTask”模块,须在调用“int InitSystem(int argc, char** argv)”函数之前注册。

#include <Symbol.h>

#include <MyFrame.h>

#include <Kernel.h>

 

int main (int argc, char** argv)

{

     //向WinSail V2.0注册“多任务MultiTask”模块

    //Register Multitask Protoent stack!

    //      KernelInitProcess -- Initlize Function For Multitask!

    //      KernelCloseProcess -- Close Function For Multitask!

    //      __MultiTaskDelay -- Sleep Function For Multitask!

    ::AfxRegisterMultitaskEntry(::KernelInitProcess,

            ::KernelCloseProcess, ::__MultiTaskDelay);//注册WinSail-多任务栈

 

  //Initlize Sysem Kernel

     if (!::InitSystem(argc, argv))//初始化系统内核

     {

            ::CloseSystem();//关闭系统内核

            ::printf("\nInit System Error!");

            return(0);

     }

 

 

    //这里增加您的代码

    //……

 

    ::CloseSystem();//关闭WinSail 内核

    return (0);

}

 

 

3:启动线程函数是int AfxBeginProcess(int (*pFc)(DWORD) , DWORD dwParam,WORD wStackSize= DEFAULT_STACK_SIZE);

     int hProcess  = AfxBeginProcess(MyThread_01,  0,  DEFAULT_STACK_SIZE );

 //若调用下面的结束进程函数,将强置进程结束。危险!可能“文件未关闭”或“类的析构函数未调用”或“内存未释放”

     int AfxEndProcess(int hProcess);

//提交CPU时间,调用函数

     void KernelDelay(WORD wDelayTime);

 

//独占CPU时间,直至调用“释放CPU时间”

WORD KernelSaveAndCloseLoop(); //开始独占

void KernelRestoreLoop(WORD wKernel);//结束独占

4:由于kbhit()函数内部调用了中断INT21,推荐使用WinSail内核的API函数--AfxKbhit()函数代替。

5:每次调度任务时,内核时钟会“前进一步”,可通过DWORD AfxGetSystemCounter()函数获得时钟“响声”