我正在使用IRC下载客户端,并且可以通过单击包含服务器地址,端口和下载文件所需的所有其他信息的链接来添加下载IRC。我将这些信息保存到文件中,以便在用户退出并重新启动下载客户端时重新下载下载列表。加载下载列表时,我为每次下载运行一个CWinThread
函数。该函数创建所有服务器连接的列表(矢量)。如果到适当服务器的连接不存在,则相应地添加一个新连接。一切都按预期工作,但如果我将项目添加到CTreeCtrl
,程序周期似乎有所不同。向CTreeCtrl插入项目时线程函数的奇怪行为
//For each download I'm calling this in a loop
AfxBeginThread(RequestDownload, (LPVOID)&m_RequestStruct);
//In this function I'm comparing the available server
//connections with the required server connection
//for the download and set a BOOL if it exists
UINT MyProgramDlg::RequestDownload(LPVOID pParam)
{
//...
if (ConnectionExists)
{
//Use the connection and
//don't add a new one to the list
}
if (!ConnectionExists)
{
//Add a new connection
ConnectionStruct Connection;
Connection.Status = STAT_DISCONNECTED;
Connection.Connecting = FALSE;
Connection.Connected = FALSE;
Connection.LoggingOn = FALSE;
Connection.LoggedOn = FALSE;
Connection.Listening = FALSE;
Connection.NetworkName = pRS->pm_Downloads->at(DownloadIndex).NetworkName;
Connection.NetworkAddress = pRS->pm_Downloads->at(DownloadIndex).NetworkAddress;
// Insert the tree item and save its handle
// The following line is the EVIL LINE that makes my program misbehave
Connection.hTreeItem = pRS->pm_TreeCtrl->InsertItem(_T("Test"), 0, 0, NULL, NULL);
// Add the new connection
pRS->pm_Connections->push_back(Connection);
// (BREAK POINT 1)
// Get the index of the added connection
ConnectionIndex = (int) pRS->pm_Connections->size() - 1;
// (BREAK POINT 2)
//...
}
//...
}
如果我加载来自同一服务器地址的两个下载没有(!),“邪恶线”,调试器从断点1跳到从断点1再次突破点2,然后突破点2。但随着邪恶线被启用它从跳转点1跳到断点1,然后从断点2跳到断点2.
我非常需要解决这个问题。 任何帮助表示赞赏!
MyProgramDlg :: RequestDownload函数是一个静态成员函数吗?因为它需要。一个非静态成员函数有一个隐藏的参数变成'this'变量。这样的问题通常通过使用静态封装函数来解决,这些函数作为参数采用一个包含(指向)对象的结构,然后使用该对象调用实函数。 –
是的,它是一个静态成员函数 –
那么这个函数是由多个线程运行吗?如果是这样的话,听起来好像你是调试器中的线程之间的上下文切换与每个步骤指令。如果你在这样一个函数中有一个断点,Visual Studio会这样做。调出线程窗口。开始调试。检查跳转时是否处于不同的线程中。 这种情况下的解决方法是右键单击不想调试的线程,然后选择“暂停”(可能是“冻结”,我忘记了),然后恢复调试。确保在完成后解冻它 – Joe