这是不是要涉及到“线程”或是“进程”的概念?
for(int i=1;i<block_num;i++)//block_num是将文件分成的块数
{
mingf.Read(buf, block_size);
Encrypt(buf);//表示对buf中数据加密
///我想在进行第一块加密的时候,从文件中读出下一块
} 请给我讲讲具体怎样操作,行吗?
或者给个例子。谢谢!!!
for(int i=1;i<block_num;i++)//block_num是将文件分成的块数
{
mingf.Read(buf, block_size);
Encrypt(buf);//表示对buf中数据加密
///我想在进行第一块加密的时候,从文件中读出下一块
} 请给我讲讲具体怎样操作,行吗?
或者给个例子。谢谢!!!
为了防止发生缓冲中没数据而写进程却在读取缓冲和写进程正在读缓冲而读进程却要写缓冲的情况,我们设置一个全局变量gControl[2](数量为2,因为有2个block的缓冲),其值表示的情况如下:
gControl[i]=0-->缓冲准备好了,写进程可以操作;
gControl[i]=1-->缓冲未准备好,正由读进程进行写入缓冲;
gControl[i]=2-->缓冲未准备好,正由写进程进行读取缓冲。
另外,设置一个“锁”--gLock,防止某个线程正在改写全局变量时另一个线程要操作该变量:gLock=0时,不能操作;gLock=1时,可以操作。并定义操作gColtrol变量的步骤:
1、gLock=0
2、改变gColtrol[i]
3、gLock=1
操作gColtrol的函数:
int RequestBuffer(int mode) // 请求操作缓冲
//mode=0 表示是写进程发来的操作请求
//mode=1 表示是读进程发来的操作请求
{
while(gLock)
{
gLock=0;
if (gColtrol[0]==0 || gColtrol[1]==0)
{
if (gColtrol[0]==0)
{
gControl[0]=(mode=0?2:1);
gLock=1;
return(0);
}
else
{
gControl[0]=(mode=0?2:1);
gLock=1;
return(1);
}
}
gLock=1;
//这里可以适当延迟一定时间。
}
}
}void ReleaseBuffer(int mode) // 释放缓冲操作
{
//从略,可以参考RequestBuffer
}
读、写进程的大概形式是:
写进程:
while (TRUE)
{
int blockcanuse=RequestBuffer(0);
// 读bolckcanuse的缓冲
ReleaseBuffer(0);
//对数据加密
}读进程:
while(TRUE)
{
// 读block大小的文件
int bolckcanuse=RequestBuffer(1);
// 向blockcanuse的缓冲写bolck
ReleaseBuffer(1)
}最后,只要设定gColtrol[0]=gColtrol[1]=1,gLock=1,创建读、写进程,就可以了。说了好多废话,没有仔细考虑死锁的问题,请大家指教了,呵呵。
1、void ReleaseBuffer(int buffer_number)
2、gControl[i]:
0-->缓冲区空,等待读进程写缓冲;
1-->缓冲区满,等待写进程读缓冲;
2-->缓冲未准备好,正由读进程写缓冲;
3-->缓冲未准备好,正由写进程读缓冲。
3、gControl[0]=gControl[1]=0为初始值。
4、int RequestBuffer(int mode) // 请求操作缓冲
//mode=0 表示是写进程发来的操作请求
//mode=1 表示是读进程发来的操作请求
{
while(gLock)
{
if (mode) // 读进程请求缓冲
{
gLock=0;
if (gColtrol[0]==0 || gColtrol[1]==0)// 寻找可写入的缓冲
{
if (gColtrol[0]==0)
{
gControl[0]=2; // 告知缓冲正在被写入
gLock=1;
return(0);
}
else
{
gControl[0]=2;
gLock=1;
return(1);
}
}
}
else // 写进程请求缓冲
{
gLock=0;
if (gColtrol[0]==1 || gColtrol[1]==1)// 寻找可以读出的缓冲
{
if (gColtrol[0]==1)
{
gControl[0]=3; // 告知缓冲正在被读出
gLock=1;
return(0);
}
else
{
gControl[0]=3;
gLock=1;
return(1);
}
}
}
gLock=1;
//这里可以适当延迟一定时间。
}
}
}自己随手所写,有欠考虑,浪费楼主的时间,万分抱歉。