- 日志
- 好友
- 卖家信用
- 买家信用
- 注册时间
- 2009-4-27
- 在线时间
- 小时
|
楼主 |
发表于 2011-12-1 01:58:14
|
显示全部楼层
憨吃迷糊睡 发表于 2011-11-30 22:09
迷糊估计的问题以及考虑的解决办法:
1)在output_data_2_file函数中是否调用了类似于flush这样的函数,把 ...
多谢糊涂的建议.
1)文件都不大,所以没有使用带缓冲的文件流方式,不过可以考虑试试看,多线程中确实最好不要使用stdio
2)的方法不能很好解决问题,原因就是3)所示的问题,前面生成数据是有依赖性的,就是说后面生成的数据会依赖前一次的数据,读的时候我可以设置循环,直到读取成功为止,但生成数据的时候这样处理的话它会直接跳过,进行下一次处理,显然,一旦跳过,后面的数据都将不正确,而如果设置循环的话,由于顺序的问题,可能会出现死循环,本来在等1的结果,但实际操作流却跳到了3,而3又需要等待2的结果,2又再等待1的结果,该处理1的却进入到3的处理了,这样就形成死循环~~~(不好意思,写得有点乱,不太容易理解)
3)那个现象很奇怪也很难重现,我在pc上做了个模拟的小程序,始终不能重现,用Sleep()来延长时间,又在其中加stdio操作,依旧不能重现,明天去试试用win32的io操作来替代stdio操作。
对9楼的情况,我试图做了如下的一段例子来重现,但并没有出现那个现象
void output_data(int gnr)
{
int i;
char filename[256];
int temp, temp2;
FILE *fp; //ファイル・ポインター
for(i = 0; i < 256; i++)
filename = '\0';
strcpy(filename, "test");
//100の位の数字設定
temp = (gnr + 1) / 100;
filename[4] = 48 + temp;
temp2 = (gnr + 1) - (temp * 100);
//10の位の数字設定
temp = temp2 / 10;
filename[5] = 48 + temp;
temp2 = temp2 - (temp * 10);
temp = temp2;
filename[6] = 48 + temp;
strcat(filename, ".dat");
fp = fopen(filename, "wb");
fprintf(fp, "%d\n", gnr);
for(i = 0; i <= gnr; i++) {
fprintf(fp, " %5d : ", i);
}
fclose(fp);
printf("file ok :%d\n", gnr);
}
void fileout()
{
for(int i=0; i<99;i++)
{
//printf("count 1 at :%d\n", i);
output_data(i);
//Sleep(2000);
printf("file ok(fileout func) :%d\n", i);
}
}
void cout1()
{
for(int i=0; i<100;i++)
{
printf("count 1 at :%d\n", i);
Sleep(20);
}
}
void cout2()
{
for(int i=0; i<100;i++)
{
printf("count 2 at :%d\n", i);
Sleep(20);
}
}
DWORD WINAPI mycount(LPVOID param)
{
fileout();
cout1();
cout2();
MessageBox(NULL,L"test",L"test",MB_OK);
return 0;
}
运行起来会等cout1,cout2的计数完成后才弹出messagebox,但把MessageBox(NULL,L"test",L"test",MB_OK);加到我项目中线程入口函数的最后一行,线程一激活,立马就弹出来。。。
继续解决中。。。。。 |
|