大家看看下面這個程序,一共有幾個STA套間?
2006-8-1
最近一直在看組件的多線程模型這一塊的內容,感覺甚爲模糊。
大家幫忙分析下我的這個程序,看看共有幾個套間。
1、組件程序我的組件是簡單的文件操作,寫入一串字符串“This is a test!”到c:/123.txt中,大家先要創建c:/123.txt文件。(組件的線程模型爲STA,非主STA) 代碼如下:
STDMETHODIMP CTheMath::FileWrite(LPCTSTR FileName, int i)
{
DWORD WriteCount;
HANDLE hr;
hr = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hr, 0, NULL, FILE_END);
WriteFile(hr, "This is a test!", 17, &WriteCount, NULL);
CloseHandle(hr);
return S_OK;
}
2、調用組件的win32控制檯應用程序,一共創建了10個線程,同時調用組件的FileWrite接口函數,代碼如下:
DWORD WINAPI ExecProc(void *p)
{
CoInitializeEx(0, COINIT_APARTMENTTHREADED);
ITheMath *ptrMath;
HRESULT hr = CoCreateInstance(CLSID_TheMath,
NULL,
CLSCTX_SERVER,
IID_ITheMath,
(void **)&ptrMath);
if FAILED(hr)
{
cout<<"Get ptrMath error!"<<endl;
return hr;
}
cout<<"Now Begin to create file!"<<endl;
ptrMath->FileWrite(_T("c://123.txt"));
ptrMath->Release();
CoUninitialize();
return(hr);
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
HANDLE hr;
DWORD ThreadID;
for (i=0; i<1000; i++)
{
hr = CreateThread(NULL, 0, ExecProc, &i, 0, &ThreadID);
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
/*
for (i=0; i<1; i++)
{
hr = CreateThread(NULL, 0, ExecProc, NULL, 0, &ThreadID);
ResumeThread(hr);
}
*/
return 0;
}
1)大家幫忙看看這個程序一共創建了多少個STA套間,每個STA套間之間是否有關係。
2)這1000個線程是否創建了1000個STA,這1000個STA之間是否有關係?是否也創建了1000個STA對象。
3)這裏的消息循環能否保證文件讀寫部分的安全性,在我的機器上,程序執行,在c:/123.txt中產生了1000條This is a test!數據,似乎一切正常。那麼好像只有1個STA套間,所有的文件寫操作好像通過消息循環同步了。
希望大家能指點指點,謝謝!