辣手:多线程中的主线程调用子线程的问题? (200分)

  • 主题发起人 主题发起人 ynhhr
  • 开始时间 开始时间
Y

ynhhr

Unregistered / Unconfirmed
GUEST, unregistred user!
大家帮我看看这段cbuilder测试代码:
/*ThLStud为TThreadList型指针变量,Baff是其它函数传递过来的字符数组,跟Buff一样长,存放从麦克采集进来的语音数据,然后发送到网络上,结果直接发送Baff没问题,但经过ThLStud转一道后取出来放到Buff再发送出去的,接收到的声音很怪,单步调试用Watch看Buff的内容比Baff少最后一个字符,但用StrLen()看两个都一样长,用StrComp()比较两个字符串返回值为0,不知何故,如何解决?*/
TList *pList = ThLStud->LockList();
pList->Add(Baff);
StrCopy(Buff,(char *)pList->Items[pList->Count-1]);
/*奇怪的问题源于此 :)*/
StrCopy(Buff,(char *)pList->Items[k]);
ThLStud->UnlockList();

FSendSocket->Send(( Buff,Len);
 
StrCopy好象对#0以后的数据不处理,是不是这个惹的祸?
 
无计兄弟,那如何解决?
 
用Move()把
buffer:pchar;
Move(buffer^,baff^,buffer里数据的长度);
buffer:array[0..n]of char;
Move(buffer,baff^,buffer里数据的长度);
 
无忌:
你说的办法我试过,用memcopy替换StrCopy就好了。但是另外的问题又出现了,我怀疑是多线程的问题,帮我看看好吗?
主线程:
TGroupThread * ctThread ;
void __fastcall TfmServer::BBtnStartTalkClick(TObject *Sender)
{
ctThread = new TGroupThread(参数);
}
void __fastcall TfmServer::MMWaveIn1BufferReady()
{
ctThread->BufferLoad();
}
我创建的线程内函数如下:
void __fastcall TGroupThread::Execute()
{
Synchronize(UpdateMemoSetup);//显示启动信息
WSRecieve = new TWSocket(NULL);
WSRecieve->Addr = "0.0.0.0";
WSRecieve->Port = iRecvPort + 1;
WSRecieve->Proto = "udp";
WSRecieve->OnDataAvailable = OnDataAvailable;
WSRecieve->Listen();
FSendSocket = new TWSocket(NULL);
FSendSocket->Addr = "192.168.168.255";
FSendSocket->Port = iRecvPort;
FSendSocket->Proto = "udp";
FSendSocket->Connect();
//MMWaveOut1->Started();

WSRecieve->MessageLoop();
}
//---------------------------------------------------------------------------
void __fastcall TGroupThread::OnDataAvailable(TObject *Sender, WORD Error)
{
int Len;
char Baff[BUFF_SIZE];
TSockAddrIn Src;
int SrcLen;
TInAddr FServerAddr ;
String Str;
SrcLen = sizeof(Src);
Len = WSRecieve->ReceiveFrom(Buff, sizeof(Buff), Src, SrcLen);
TList *pList = ThLStud->LockList();
pList->Add(Buff);
//memcpy(Baff, (char *)pList->Items[pList->Count-1], BUFF_SIZE);
ThLStud->UnlockList();
//FSendSocket->Send(Baff,Len);
iLRecvBufCount++;
......
}
//---------------------------------------------------------------------------
void __fastcall TGroupThread::BufferLoad()
{
char Buff1[MAX_GROUP_STUDENT][BUFF_SIZE];
int i ;
long lBuff[BUFF_SIZE] ;
TList *pList = ThLStud->LockList();
if (pList->Count == 0)
{
ThLStud->UnlockList();
return;
}
memcpy(Buff1, (char *)pList->Items[0], BUFF_SIZE);
pList->Delete(0);
ThLStud->UnlockList();
FSendSocket->Send(Buff1[0],BUFF_SIZE);
}
/************************************************************************/
主线程只是调用TGroupThread的函数,来访问TGroupThread的私有变量ThLStud、FSendSocket、Buff等,这样共享数据有无问题?程序运行正常,只是客户端接收到的声音不太像,有背景噪音。
 
一般麦克风采集的声音确实不太好,有噪音很正常,
你可以用一些算法过滤掉噪音。不过我对这个不熟悉。
memcopy(C/C++)和move(Delphi)一样,都是库函数,
功能也是一样的。
 
无忌:
我处理多线程数据共享的方式你能看出有什么问题吗?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
806
import
I
后退
顶部