国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Windos核心編程學(xué)習(xí)筆記

2019-11-08 03:10:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
1、獲取錯(cuò)誤信息   1)GetLastError(),FormatMessage();   2)在VS的Watch窗口中使用$err,hr來(lái)查找當(dāng)前線程的“上一個(gè)錯(cuò)誤代碼”;2、緩沖區(qū)溢出,這個(gè)是處理字符串時(shí)的典型錯(cuò)誤;3、字符串或者字符前面加上字母L,則通知編譯器該字符串或者字符應(yīng)該編譯成為一個(gè)Unicode的字符串或者字符,比如L"A String",L'A';4、errno.h ERANGE范圍錯(cuò)誤發(fā)生,STRUNCATE字符截?cái)啵?、ShellExecute(NULL,"open",NULL,NULL,m_strPath.c_str(),SW_SHOWNORMAL);打開(kāi)當(dāng)前的文件夾;6、在任務(wù)條上顯示圖標(biāo)是利用系統(tǒng)API函數(shù)Shell_NotifyIcon()來(lái)將一個(gè)圖標(biāo)顯示在任務(wù)欄的通告區(qū)中;7、GetExitCodePRocess()獲取指定進(jìn)程的狀態(tài),或者其退出的信息;8、GetCurrentProcessId(),GetProcessId(),GetThreadId();獲得進(jìn)程或者線程的ID;9、 PostMessage只把消息放入隊(duì)列,不管其他程序是否處理都返回,然后繼續(xù)執(zhí)行,這是個(gè)異步消息投放函數(shù)。10、SendMessage必須等待其他程序處理消息完了之后才返回,繼續(xù)執(zhí)行,這是個(gè)同步消息投放函數(shù)。而且,PostMessage的返回值表示PostMessage函數(shù)執(zhí)行是否正確;而SendMessage的返回值表示其他程序處理消息后的返回值。11、創(chuàng)建線程后返回了線程句柄,新創(chuàng)建的線程內(nèi)核對(duì)象的使用計(jì)數(shù)是2,一個(gè)是線程本身,一個(gè)是創(chuàng)建線程的線程,創(chuàng)建線程的線程closehandle后,新的線程的內(nèi)核對(duì)象使用計(jì)數(shù)為1,當(dāng)這個(gè)新線程結(jié)束運(yùn)行后內(nèi)核對(duì)象的使用計(jì)數(shù)還要減1,這時(shí)內(nèi)核對(duì)象的使用計(jì)數(shù)是0,則系統(tǒng)會(huì)自動(dòng)刪除新線程的內(nèi)核對(duì)象,這是正常的處理流程。12、進(jìn)程或線程對(duì)象會(huì)在停止運(yùn)行時(shí)被觸發(fā);13、Microsoft選擇在已分配的CPU時(shí)間到期時(shí),才將作業(yè)的狀態(tài)變成已觸發(fā);14、CreateThread()函數(shù)是用于創(chuàng)建線程的Windows函數(shù),beginthreadex是Microsoft C++運(yùn)行庫(kù)函數(shù)。15、在用findfirst()和findnext()函數(shù)去查找磁盤文件時(shí)經(jīng)常使用的一個(gè)數(shù)據(jù)結(jié)構(gòu)WIN32_FIND_DATA的成員變量里包含了以上所有的文件屬性,因此可以通過(guò)這個(gè)結(jié)構(gòu)作為獲取和更改文件屬性的手段。16、HANDLE GetCurrentProcess(),GetCurrentThread(),返回的都是偽句柄,通過(guò)CloseHandle只是簡(jiǎn)單的忽略此調(diào)用,并返回FALSE;線程的偽句柄是一個(gè)指向當(dāng)前線程的句柄,如果把父線程的偽句柄傳遞給子線程,那么在子線程中對(duì)此父線程的偽句柄進(jìn)行操作,實(shí)際上是對(duì)子線程的操作;故需要通過(guò)DuplicateHandle()(增加線程的使用計(jì)數(shù))將偽句柄轉(zhuǎn)換成真正的句柄,并且使用完這個(gè)函數(shù)之后還要先調(diào)用CloseHandle來(lái)減少線程的使用計(jì)數(shù)。17、盡量使用C/C++運(yùn)行庫(kù)函數(shù)_beginthreadex和_endthreadex來(lái)創(chuàng)建線程和銷毀線程,因?yàn)檫@類函數(shù)內(nèi)部自己維護(hù)了一個(gè)線程的內(nèi)存塊。18、WaiteForDebugEvent()返回的調(diào)試事件時(shí),Windwos將凍結(jié)被調(diào)試進(jìn)程中的所有線程,直至調(diào)試器調(diào)用ContinueDebugEvent,目前沒(méi)有直接掛起進(jìn)程的函數(shù),可以自己編寫。19、睡眠:Sleep(0),告訴系統(tǒng),主調(diào)線程放棄了時(shí)間片的剩余時(shí)間,強(qiáng)制系統(tǒng)調(diào)用其他線程。Sleep(0)只會(huì)調(diào)入優(yōu)先級(jí)大于等于主線程的其它線程,而輔助線程的優(yōu)先級(jí)低,那么應(yīng)該來(lái)說(shuō)根本就輪不到調(diào)用它,從2003 server開(kāi)始,Sleep(0)變成了調(diào)度所有可調(diào)度線程,跟SwitchToThread差不多了20、切換到其他線程:Switchtothread當(dāng)調(diào)用這個(gè)函數(shù)的時(shí)候,系統(tǒng)要查看是否存在一個(gè)迫切需要CPU時(shí)間的線程。如果沒(méi)有線程迫切需要CPU時(shí)間,SwitchToThread就會(huì)立即返回FALSE。如果存在一個(gè)迫切需要 CPU時(shí)間的線程,SwitchToThread就對(duì)該線程進(jìn)行調(diào)度(該線程的優(yōu)先級(jí)可能低于調(diào)用 SwitchToThread的線程)。21、關(guān)鍵段(對(duì)共享資源進(jìn)行“原子”訪問(wèn))的最大好處在于它們非常容易使用,而且它們?cè)趦?nèi)部也使用了Interlocked函數(shù),因此執(zhí)行速度非常快。最大的缺點(diǎn)在于它們無(wú)法用來(lái)在多個(gè)進(jìn)程之間對(duì)線程進(jìn)行同步。22、DestroyWindow()非模態(tài)對(duì)話框的窗口銷毀;EndDialog(IDCANCEL) ; //模態(tài)對(duì)話框的窗口銷毀。23、 volatile 關(guān)鍵字只在 Release 模式下才發(fā)揮了它的作用,當(dāng)使用 volatile 聲明的變量的值的時(shí)候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),而不會(huì)對(duì)其優(yōu)化。24、對(duì)于關(guān)鍵代碼段而言,對(duì)于同時(shí)使用對(duì)個(gè)鎖的時(shí)候,我們必須在代碼中的任何地方以完全相同順序來(lái)獲得資源的鎖。但是在調(diào)用LeaveCritoCalSection的時(shí)候順序無(wú)關(guān)緊要,這是因?yàn)樵摵瘮?shù)從來(lái)不會(huì)讓線程進(jìn)入等待狀態(tài)。25、WaiteForMultipleObject(,,false,)函數(shù)如果等到一個(gè)內(nèi)核對(duì)象以后,需要將這個(gè)已觸發(fā)的句柄從數(shù)組中移除,否.在每次調(diào)用的時(shí)候都會(huì)直接返回。26、CreateWaitableTimer(),TRUE手動(dòng)定時(shí)器,需要調(diào)用SetWaitableTimer才能將定時(shí)器變成信號(hào),如果FALSE,自動(dòng)定時(shí)器,需要調(diào)用WaitForSingleObject即可實(shí)現(xiàn)定時(shí)器信號(hào)的重置。WaitforsingleObject即使有回調(diào)函數(shù)也是不會(huì)執(zhí)行的27、SetWaitableTimer如果值是正的,代表一個(gè)特定的時(shí)刻。如果值是負(fù)的,代表以100納秒為單位的相對(duì)時(shí)間。28、PtrToUlong;29、MoveMemory將一段內(nèi)存移到什么位置。30、就類對(duì)象而言,相同類型的類對(duì)象是通過(guò)拷貝構(gòu)造函數(shù)來(lái)完成整個(gè)復(fù)制過(guò)程的。拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),函數(shù)的名稱必須和類名稱一致,它的唯一的一個(gè)參數(shù)是本類型的一個(gè)引用變量,該參數(shù)是const類型,不可變的,例如:類X的拷貝構(gòu)造函數(shù)的形式為X(X& x)。以下情況都會(huì)調(diào)用拷貝構(gòu)造函數(shù):一個(gè)對(duì)象以值傳遞的方式傳入函數(shù)體 一個(gè)對(duì)象以值傳遞的方式從函數(shù)返回 一個(gè)對(duì)象需要通過(guò)另外一個(gè)對(duì)象進(jìn)行初始化。 31、接收I/O請(qǐng)求完成通知的方法:觸發(fā)設(shè)備內(nèi)核對(duì)象,觸發(fā)事件內(nèi)核對(duì)象,I/O完成端口32、QueueUserAPC,允許手動(dòng)地將一項(xiàng)添加到APC隊(duì)列中,,他可以非常高效的進(jìn)行線程間通信,甚至能夠跨越進(jìn)程的界限,但是只能傳遞一個(gè)值。33、當(dāng)線程被掛起的時(shí)候,如果我們等待的那個(gè)(或那些)內(nèi)核對(duì)象被觸發(fā),或線程的APC隊(duì)列中出現(xiàn)了一項(xiàng),那么線程都將被喚醒,所以我們可以通過(guò)調(diào)用QueueUserAPC函數(shù),手動(dòng)地向指定線程的APC隊(duì)列中添加一項(xiàng),如果線程(或者GetLastError)返回的是WAIT_IO_COMPLETION,那么我們就知道線程得以繼續(xù)執(zhí)行的原因是線程至少處理了APC隊(duì)列中的一項(xiàng),如果返回的WAIT_OBJECT_0,那證明線程等待的內(nèi)核對(duì)象被觸發(fā),處于有信號(hào)狀態(tài)。34、GetQueuedCompletionStatus的任務(wù)基本上就是將調(diào)用線程切換到睡眠的狀態(tài),直到指定的完成端口的I/O完成隊(duì)列中出現(xiàn)一項(xiàng),或者等待的時(shí)間已經(jīng)超出了指定的時(shí)間。35、在C++編譯器里不用extern “C”括起C代碼,會(huì)導(dǎo)致編譯器不知道該如何為 C 代碼描述內(nèi)存布局。36、PostQueuedCompletionStatus(),可以用來(lái)喚醒正在等待完成端口但又沒(méi)有已完成的I/O請(qǐng)求的所有線程,使得線程退出,不用再繼續(xù)等待。37、SetFilePointerEx(hFileDst, liFileSizeSrc, NULL, FILE_BEGIN);從文件的開(kāi)始位置,將文件指針移動(dòng)liFileSizeSrc個(gè)字節(jié)    SetEndOfFile(hFileDst);將當(dāng)前文件指針?biāo)诘奈恢迷O(shè)置為文件的結(jié)尾,從文重新設(shè)置了文件的大小。38、HWND hwnd = GetForegroundWindow();//獲取調(diào)用者進(jìn)程當(dāng)前正在使用的那個(gè)窗口的句柄    HDC hdc = GetDC(hwnd);//轉(zhuǎn)換成窗口所對(duì)應(yīng)的hdc24.2.3 暫停全局展開(kāi) 看到這里了    // Nonbuffered I/O requires sector-sized transfers.      // I'll use buffer-size transfers since it's easier to calculate.      liFileSizeDst.QuadPart = chROUNDUP(liFileSizeSrc.QuadPart, BUFFSIZE);
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 诸暨市| 托克逊县| 游戏| 庆云县| 普安县| 平乡县| 济宁市| 西吉县| 保德县| 大姚县| 临猗县| 玉门市| 尉犁县| 赞皇县| 浏阳市| 会东县| 岑巩县| 肇源县| 鞍山市| 资溪县| 定远县| 中方县| 陆川县| 翁源县| 肥东县| 青浦区| 贵港市| 即墨市| 方正县| 岑巩县| 尼勒克县| 梁平县| 尉犁县| 同江市| 鹤壁市| 瑞安市| 柘城县| 敖汉旗| 右玉县| 临海市| 环江|