获得多任务支持
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()函数获得时钟“响声”