线程同步互斥主要按钮设计思想
1.“开始”按钮设计思想
开始按钮利用循环,创建相应数量的线程。下面以生产者线程的创建进行举例说明:
(1) 在参数设置界面获取到的生产者线程数量赋值给Produce_Num,从而进行循环个数的限定。
for (k = 0; k <= PAGE1.Produce_Num - 1; k++)
(2) 首先进行参数的赋值,并将其作为实参传递给该线程的函数入口。
{
pthread1.dlg = this; //可以写到for循环外面
pthread1.ptid = k;
(3) 调用创建线程的函数,线程的函数入口位PUTTER函数,参数位上述设置好的指针。第4个参数为零表示创建之后立即激活。
P_hThreads[k] = CreateThread(NULL, 0, PUTTER, (LPVOID)&pthread1, 0, NULL);
(4) 暂停,继续,结束,清空按钮与上述类似,在此不再赘述。
2.“保存”按钮设计思想
(1) 保存按钮主要保存历史记录界面的listbox中三个BUFFER各自的内容,首先进行保存路径的获取。
CString PATH;
CFileDialog dlg(TRUE);
if (dlg.DoModal() == IDOK)
PATH = dlg.GetPathName(); //获取文件路径
(2) 定义一个Cfile对象,并将其变为UNICODE编码,以进行换行操作和防止中文乱码。
int n, i,j,k;
n = h->PAGE3.Show1.GetCount();
CFile myFile;
CFile mFile(PATH, CFile::modeWrite | CFile::modeCreate);
wchar_t unicode = 0xFEFF;
mFile.Write(&unicode, sizeof(wchar_t));//将文件变为UNICODE编码
(3) 将BUFFER1内容写入。将写入操作设置为一个循环,从BUFFER1的n-1行开始一直到第0行结束进行保存,即按照BUFFER1历史记录中出现的先后顺序,将其保存至相应的文件。
b = “BUFFER1历史记录”;
mFile.Write(b, 22);
mFile.Write(_T(“\r\n”), 2 * sizeof(wchar_t));
for (i = n - 1; i >= 0; i–)
{
h->PAGE3.Show1.GetText(i, a);
mFile.Write(a, 8);
mFile.Write(_T(“\r\n”), 2 * sizeof(wchar_t));
mFile.Flush();
}