函数 void A() 创建一个线程 B,这个线程每 1 秒创建一个线程 C,即下面这个线程
pb->handle = (HANDLE)CreateThread(NULL, 0, ThreadBullet, (Plants*)pb, 0, NULL);//建立子弹线程
if(pb->handle<=0)
{
pb->flag=false;printf("\n【C线程%d建立失败】\n",pb->handle);return 0;
}
其中 pb 来自于结构
struct Plants
{
bool flag; //是否存在
int i; //形象序号
HANDLE handle;
int n; //种类
Plants *next;
};
通过这样的操作我可以制作多个炮台发射子弹。
子弹线程是这样的
DWORD WINAPI ThreadBullet(PVOID pM)
{
Plants *ppb=(Plants*)pM;
if(ppb->handle<=0)
{
pb->flag=false;printf("\n【C线程%d建立失败】\n",pb->handle);return 0;
}
if(ppb->handle)
{
ppb->flag=true;
switch(ppb->n)
{
case -1: bullet_A((Plants*)pM);break;
case 1: bullet_1((Plants*)pM);break;
case 2: bullet_2((Plants*)pM);break;
case 3: bullet_3((Plants*)pM);break;
case 5: bullet_5((Plants*)pM);break;
case 6: bullet_6((Plants*)pM);break;
default: break;
}
}
return 0;
}
其中不同的 n 对应不同的子弹函数。
但是问题来了。有的时候我发射的子弹明明是 n=1 时的,却拥有 n=2 时的属性。明明我的设置一直是 i=1,但是发射后有一次出现了 i=54 的个例。我检查了一下,此时 handle 的值是一个奇怪负值,但从来没有出现过【C线程 %d 建立失败】这句输出。应该是线程创建失败了吗?网上说 CreateThread 会造成内存溢出什么的,是这个原因吗?应该怎么解决呢?
看网上说 _beginthreadex 这类函数比 CreateThread 更优越,但是我的 VC++2010 好像用不了这个?