博客園首頁(yè)聯(lián)系管理
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)建站專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營(yíng)網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁(yè)面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都航空箱等企業(yè)提供專業(yè)服務(wù)。
jiffies相關(guān)時(shí)間比較函數(shù)time_after、time_before詳解
1. jiffies簡(jiǎn)介
首先,操作系統(tǒng)有個(gè)系統(tǒng)專用定時(shí)器(system timer),俗稱滴答定時(shí)器,或者系統(tǒng)心跳。
全局變量jiffies取值為自操作系統(tǒng)啟動(dòng)以來(lái)的時(shí)鐘滴答的數(shù)目,數(shù)據(jù)類型為 unsigned long volatile (32位無(wú)符號(hào)長(zhǎng)整型),最大取值是2^32-1。
2. jiffies與秒的轉(zhuǎn)換
將 jiffies轉(zhuǎn)換為秒,可采用公式:(jiffies/HZ) 計(jì)算。
將 秒轉(zhuǎn)換為jiffies,可采用公式:(seconds*HZ) 計(jì)算。
示例(本博客后面將介紹涉及到的time_before):
unsgned long delay = jiffies + 2*HZ;
while(time_before(jiffies, delay)); // 忙等待兩秒,占用CPU的一個(gè)核心,期間不執(zhí)行調(diào)度
3. jiffies的溢出介紹
當(dāng)時(shí)鐘中斷發(fā)生時(shí),jiffies值就加1。
假定HZ=100,那么1個(gè)jiffies等于1/100 秒,jiffies可記錄的最大秒數(shù)為(2^32 -1)/100=42949672.95秒,約合497天或1.38年,
當(dāng)取值到達(dá)最大值時(shí)仍繼續(xù)加1,就變?yōu)榱?!
即HZ=100時(shí),連續(xù)累加的溢出時(shí)間是一年又四個(gè)多月,如果程序?qū)iffies的溢出沒有加以充分考慮,那么在連續(xù)運(yùn)行一年又四個(gè)多月后,這些程序還能夠穩(wěn)定運(yùn)行嗎?
4. 示例1,一個(gè) jiffies溢出造成程序邏輯出錯(cuò) 的示例
復(fù)制代碼
unsigned long timeout = jiffies + HZ/2; /* timeout in 0.5s */
/* do some work ... */
do_somework();
/* then see whether we took too long */
if (timeout jiffies) {
/* we did not time out, call no_timeout_handler() ... */
no_timeout_handler();
} else {
/* we timed out, call timeout_handler() ... */
timeout_handler();
}
復(fù)制代碼
本例的意圖:
從當(dāng)前時(shí)間起,如果在0.5秒內(nèi)執(zhí)行完do_somework(),則調(diào)用no_timeout_handler()。如果在0.5秒后執(zhí)行完do_somework(),則調(diào)用timeout_handler()。
然后當(dāng)溢出時(shí)呢? 該意圖會(huì)被打破嗎?
假設(shè)程序開始執(zhí)行前,timeout值已經(jīng)接近最大值(即2^32-1 ) ,jiffies的值是(timeout-HZ/2),
之后do_some_work執(zhí)行了挺久(超過(guò)0.5秒),jiffies的值也發(fā)生了溢出(jiffies做自增操作的中途超過(guò)了32位無(wú)符號(hào)數(shù)的最大值),
溢出后的值,可能是很小的一個(gè)數(shù)字,所以造成jiffies的值 timeout,
之后的代碼執(zhí)行流就走到了no_time_handler()這里,這顯然和程序設(shè)計(jì)者的初衷(意圖)是違背的。
5. Linux內(nèi)核如何來(lái)防止jiffies溢出
Linux內(nèi)核中提供了一些宏,可有效地解決由于jiffies溢出而造成程序邏輯出錯(cuò)的情況。
PS:下圖源自Linux Kernel version 3.10.14
* time_after:
* time_after(a,b) returns true if the time a is after time b.
同時(shí)根據(jù) #define time_before(a,b) time_after(b,a) ,我們可以知道
* time_before(a,b) returns true if the time b is after time a.
6. time_after 在驅(qū)動(dòng)代碼中的應(yīng)用展示
7. time_after等用于時(shí)間比較的宏的原理簡(jiǎn)介
下面的文字摘錄自博文:
讀者先大致瀏覽一遍即可,不必糾結(jié)于絞盡腦汁的細(xì)節(jié)理解, 后面我將表達(dá)個(gè)人理解,讀者也可以直接向下瀏覽,看我的個(gè)人理解。
/**********************************開始摘錄********************************************/
我們?nèi)匀灰?位無(wú)符號(hào)整型(unsigned char)為例來(lái)加以說(shuō)明。仿照上面的time_after宏,我們可以給出簡(jiǎn)化的8位無(wú)符號(hào)整型對(duì)應(yīng)的after宏:
#define uc_after(a, b) ((char)(b) - (char)(a) 0)
設(shè)a和b的數(shù)據(jù)類型為unsigned char,b為臨近8位無(wú)符號(hào)整型最大值附近的一個(gè)固定值254,下面給出隨著a(設(shè)其初始值為254)變化而得到的計(jì)算值:
a b (char)(b) - (char)(a)
254 254 0
255 - 1
0 - 2
1 - 3
...
124 -126
125 -127
126 -128
127 127
128 126
...
252 2
253 1
從上面的計(jì)算可以看出,設(shè)定b不變,隨著a(設(shè)其初始值為254)不斷增長(zhǎng)1,a的取值變化為:
254, 255, (一次產(chǎn)生溢出)
0, 1, ..., 124, 125, 126, 127, 126, ..., 253, 254, 255, (二次產(chǎn)生溢出)
0, 1, ...
...
而(char)(b) - (char)(a)的變化為:
0, -1,
-2, -3, ..., -126, -127, -128, 127, 126, ..., 1, 0, -1,
-2, -3, ...
...
從上面的詳細(xì)過(guò)程可以看出,當(dāng)a取值為254,255, 接著在(一次產(chǎn)生溢出)之后變?yōu)?,然后增長(zhǎng)到127之前,uc_after(a,b)的結(jié)果都顯示a是在b之后,這也與我們的預(yù)期相符。但在a取值為 127之后, uc_after(a,b)的結(jié)果卻顯示a是在b之前。
從上面的運(yùn)算過(guò)程可以得出以下結(jié)論:
使用uc_after(a,b)宏來(lái)計(jì)算兩個(gè)8位無(wú)符號(hào)整型a和b之間的大小(或先/后,before/after),那么a和b的取值應(yīng)當(dāng)滿足以下限定條件:
. 兩個(gè)值之間相差從邏輯值來(lái)講應(yīng)小于有符號(hào)整型的最大值。
. 對(duì)于8位無(wú)符號(hào)整型,兩個(gè)值之間相差從邏輯值來(lái)講應(yīng)小于128。
從上面可以類推出以下結(jié)論:
對(duì)于time_after等比較jiffies先/后的宏,兩個(gè)值的取值應(yīng)當(dāng)滿足以下限定條件:
兩個(gè)值之間相差從邏輯值來(lái)講應(yīng)小于有符號(hào)整型的最大值。
對(duì)于32位無(wú)符號(hào)整型,兩個(gè)值之間相差從邏輯值來(lái)講應(yīng)小于2147483647。
對(duì)于HZ=100,那么兩個(gè)時(shí)間值之間相差不應(yīng)當(dāng)超過(guò)2147483647/100秒 = 0.69年 = 248.5天。
對(duì)于HZ=60,那么兩個(gè)時(shí)間值之間相差不應(yīng)當(dāng)超過(guò)2147483647/60秒 = 1.135年。
在實(shí)際代碼應(yīng)用中,需要比較的先/后的兩個(gè)時(shí)間值之間一般都相差很小,范圍大致在1秒~1天左右,所以以上time_after等比較時(shí)間先 /后的宏完全可以放心地用于實(shí)際的代碼中?!?/p>
/***********************************摘錄結(jié)束******************************************/
看完這段文字,感覺有點(diǎn)繞的,那么原理到底是啥呢? 是一堆數(shù)學(xué)計(jì)算嗎?是啊 ,就是這數(shù)學(xué)規(guī)律!
凡事都是有利有弊的,針對(duì)一件事物的優(yōu)化,有利處,必然帶來(lái)不利之處,從哲學(xué)角度來(lái)進(jìn)行理解,事物的兩面性。
本文第4部分,示例1介紹了jiffies的一個(gè)例子,它的弊處是會(huì)溢出,如果我們不抓住溢出這個(gè)弊處來(lái)看待這件事物,那么timeout的值可以做的很大,這是優(yōu)勢(shì)。
然而溢出是真實(shí)存在的,無(wú)法滿足客觀需求的,所以需要改進(jìn),
從該數(shù)學(xué)規(guī)律入手進(jìn)行改進(jìn)后,不溢出了,這是優(yōu)勢(shì),
但是改進(jìn)后對(duì)timeout的值也縮小了使用范圍,這是為了達(dá)到該優(yōu)勢(shì)所帶來(lái)的必要開銷或損耗。這就是事物的兩面性。
8. 示例2,對(duì)示例1進(jìn)行改進(jìn):使用time_before宏后的正確代碼
復(fù)制代碼
unsigned long timeout = jiffies + HZ/2; /* timeout in 0.5s */
/* do some work ... */
do_somework();
/* then see whether we took too long */
if (time_before(jiffies, timeout)) {
/* we did not time out, call no_timeout_handler() ... */
no_timeout_handler();
} else {
/* we timed out, call timeout_handler() ... */
timeout_handler();
}
復(fù)制代碼
.
/************* 社會(huì)的有色眼光是:博士生、研究生、本科生、車間工人; 重點(diǎn)大學(xué)高材生、普通院校、二流院校、野雞大學(xué); 年薪百萬(wàn)、五十萬(wàn)、五萬(wàn); 這些都只是帽子,可以失敗千百次,但我和社會(huì)都覺得,人只要成功一次,就能換一頂帽子,只是社會(huì)看不見你之前的失敗的帽子。 當(dāng)然,換帽子決不是最終目的,走好自己的路就行。 杭州.大話西游 *******/
分類: Linux驅(qū)動(dòng)
標(biāo)簽: 內(nèi)核編程
好文要頂 關(guān)注我 收藏該文
一匹夫
粉絲 - 28 關(guān)注 - 3
+加關(guān)注
00
? 上一篇: 為什么我覺得需要熟悉vim使用,難道僅僅是為了??幔?/p>
? 下一篇: 九鼎S5PV210開發(fā)板的SD卡啟動(dòng)、uboot tftp升級(jí)內(nèi)核鏡像
posted @ 2021-01-30 14:39 一匹夫 閱讀(2508) 評(píng)論(0) 編輯 收藏 舉報(bào)
刷新評(píng)論刷新頁(yè)面返回頂部
登錄后才能查看或發(fā)表評(píng)論,立即 登錄 或者 逛逛 博客園首頁(yè)
【推薦】阿里云新人特惠,爆款云服務(wù)器2核4G低至0.46元/天
編輯推薦:
· .Net 6 使用 Consul 實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)
· SQLSERVER 的復(fù)合索引和包含索引到底有啥區(qū)別?
· [ASP.NET Core] 按用戶等級(jí)授權(quán)
· 深入理解 Linux 物理內(nèi)存分配全鏈路實(shí)現(xiàn)
· 巧用視覺障眼法,還原 3D 文字特效
閱讀排行:
· 既然有MySQL了,為什么還要有MongoDB?
· C#開發(fā)的插件程序 - 開源研究系列文章
· 2022年工作總結(jié),遲到比沒到好
· 20 張圖帶你全面了解 HTTPS 協(xié)議,再也不怕面試問(wèn)到了!
· .net core操作MongoDB
公告
音樂2 - 林海
00:00 / 00:00 An audio error has occurred, player will skip forward in 2 seconds.
1 音樂1Valentin
2 音樂2林海
3 音樂3趙海洋
昵稱: 一匹夫
園齡: 5年9個(gè)月
粉絲: 28
關(guān)注: 3
+加關(guān)注
2023年1月
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4
5 6 7 8 9 10 11
搜索
找找看
谷歌搜索
常用鏈接
我的隨筆
我的評(píng)論
我的參與
最新評(píng)論
我的標(biāo)簽
我的標(biāo)簽
linux(24)
系統(tǒng)編程(21)
C++(16)
BOOST(10)
ffmpeg(7)
更多
隨筆分類
C++之QT(4)
C++之STL、Boost(12)
C++之語(yǔ)言與時(shí)俱進(jìn)(17)
C語(yǔ)言活用(9)
C語(yǔ)言自身(12)
GUI(3)
Linux驅(qū)動(dòng)(8)
Linux系統(tǒng)編程(32)
Linux應(yīng)用(13)
MCU和物聯(lián)網(wǎng)等(20)
RTOS(10)
shell 和 makefile(9)
uboot(3)
編程思維技巧(5)
編譯器特性(2)
操作系統(tǒng)(2)
電路-EDA設(shè)計(jì)(2)
電路-基礎(chǔ)知識(shí)(2)
調(diào)試篇(3)
匯編(1)
密碼學(xué)|安全|(2)
配置相關(guān)(8)
嵌入式外設(shè)相關(guān)(2)
設(shè)計(jì)模式(12)
數(shù)據(jù)結(jié)構(gòu)(3)
網(wǎng)絡(luò)(13)
我的程序人生(1)
音視頻(10)
隨筆檔案
2022年2月(3)
2022年1月(1)
2021年12月(5)
2021年11月(2)
2021年10月(1)
2021年8月(1)
2021年7月(2)
2021年5月(1)
2021年4月(6)
2021年3月(6)
2021年2月(6)
2021年1月(23)
2020年12月(11)
2020年11月(4)
2020年10月(29)
2020年9月(12)
2020年8月(12)
2020年5月(4)
2020年2月(6)
2020年1月(4)
2019年12月(2)
2019年11月(2)
2019年10月(3)
2019年8月(9)
2019年7月(2)
2019年6月(1)
2019年5月(1)
2019年4月(2)
2019年3月(5)
2019年2月(11)
2019年1月(6)
2018年1月(2)
2017年5月(1)
相冊(cè)
大話西游經(jīng)典照片(1)
閱讀排行榜
1. C++函數(shù)默認(rèn)參數(shù) 詳解(29043)
2. 玩轉(zhuǎn)Libmodbus(一) 搭建開發(fā)環(huán)境(16605)
3. 玩轉(zhuǎn)Libmodbus(二) 寫代碼體驗(yàn)(7565)
4. RTThread DFS文件系統(tǒng)使用: 基于使用SFUD驅(qū)動(dòng)的SPI FLASH之上的ELM FATFS文件系統(tǒng)(4537)
5. std(標(biāo)準(zhǔn)庫(kù))和STL(標(biāo)準(zhǔn)模板庫(kù))的關(guān)系(4149)
6. STM32CubeMX HAL庫(kù)串口: 使用DMA數(shù)據(jù)發(fā)送、使用DMA不定長(zhǎng)度數(shù)據(jù)接收(4016)
7. Arduino+ESP32 之 SD卡讀寫(3673)
8. KEIL查看ARM-Cortex M架構(gòu)soc的內(nèi)核寄存器之 MSP(3668)
9. 圖解MQTT概念、mosquitto編譯和部署 ,寫代碼,分別使用外網(wǎng)和本地服務(wù)器進(jìn)行測(cè)試(3275)
10. RT Thread的SPI設(shè)備驅(qū)動(dòng)框架的使用以及內(nèi)部機(jī)制分析(2787)
11. STM32的CCM RAM以及使用方式(2540)
12. vscode廢掉了,跳轉(zhuǎn)不到函數(shù)定義,無(wú)法自動(dòng)補(bǔ)全,重裝也沒用的解決辦法(2511)
13. jiffies相關(guān)時(shí)間比較函數(shù)time_after、time_before詳解(2508)
14. Arduino+ESP32 之 驅(qū)動(dòng)GC9A01圓形LCD(一),基于Arduino_GFX庫(kù)(2504)
15. 圖解連接阿里云(一)創(chuàng)建阿里云物聯(lián)網(wǎng)平臺(tái)產(chǎn)品和設(shè)備,使用MQTT.fx快速體驗(yàn)(2372)
16. MDK內(nèi)的KEEP關(guān)鍵字以及$$Base $$Limit(2358)
17. RT Thread SPI設(shè)備 使用(2246)
18. ESP32的Linux開發(fā)環(huán)境搭建,將示例程序編譯、下載、運(yùn)行(2243)
19. AD設(shè)置過(guò)孔蓋油和過(guò)孔開窗, 過(guò)孔塞油科普(2186)
20. Linux 串口工具 lsz lrz 移植(2172)
評(píng)論排行榜
1. 在KEIL下查看單片機(jī)編程內(nèi)存使用情況(2)
2. 玩轉(zhuǎn)Libmodbus(一) 搭建開發(fā)環(huán)境(2)
3. C語(yǔ)言普通寫法實(shí)現(xiàn):針對(duì)多次同步失敗的節(jié)能處理機(jī)制(2)
推薦排行榜
1. C++函數(shù)默認(rèn)參數(shù) 詳解(5)
2. 如何更好地謀生,從事嵌入式軟件開發(fā)五年的感悟和職業(yè)焦慮(4)
3. Arduino+ESP32 之 SD卡讀寫(2)
4. 玩轉(zhuǎn)Libmodbus(一) 搭建開發(fā)環(huán)境(2)
5. Arduino+ESP32 之 驅(qū)動(dòng)GC9A01圓形LCD(一),基于Arduino_GFX庫(kù)(1)
最新評(píng)論
1. Re:在KEIL下查看單片機(jī)編程內(nèi)存使用情況
@HQ_嗨海 謝謝...
--一匹夫
2. Re:如何更好地謀生,從事嵌入式軟件開發(fā)五年的感悟和職業(yè)焦慮
說(shuō)的不錯(cuò)
--Chance_21_12_12
3. Re:在KEIL下查看單片機(jī)編程內(nèi)存使用情況
感謝大佬
--HQ_嗨海
Copyright ? 2023 一匹夫
Powered by .NET 7.0 on Kubernetes
什么時(shí)候會(huì)用到開窗函數(shù)呢?下面介紹使用場(chǎng)景:
表test1數(shù)據(jù)如下:
現(xiàn)在我們有需求:查出它們每個(gè)年級(jí)(class)的平均分?jǐn)?shù),預(yù)期結(jié)果格式如下:
我們可以看到,根據(jù)年級(jí)class求avg()聚合后的 數(shù)據(jù)會(huì)變少一條 ,但是,我們 既要顯示聚合前的數(shù)據(jù)又要顯示聚合后的數(shù)據(jù) ,這個(gè)時(shí)候就要使用開窗函數(shù)。
測(cè)試:
查詢數(shù)據(jù):
返回結(jié)果:
出現(xiàn)的兩個(gè)問(wèn)題:
1.如果我們?cè)趐artition by class加一個(gè)order by id會(huì)出現(xiàn)什么問(wèn)題
返回結(jié)果:
可以看到class為1的兩條avg值不一致,這是因?yàn)閛rder by id是來(lái)一條數(shù)據(jù)處理一條,所以第一條class為1的數(shù)據(jù)來(lái)的只能是99/1=99。
我們可能會(huì)這樣想,先查詢出數(shù)據(jù)放到一張臨時(shí)表,然后在開窗,根據(jù)class分區(qū),再根據(jù)id排序,可是結(jié)果并不是根據(jù)id全局有序的
返回結(jié)果:
因?yàn)樗前凑辗謪^(qū)排序的,所以是分區(qū)內(nèi)有序。
另外,我們和group by分組做個(gè)對(duì)比
原始數(shù)據(jù)如下
我們可能會(huì)想,為什么同樣在這里使用了聚合函數(shù)sum(),數(shù)據(jù)條數(shù)變少了,我們?yōu)槭裁礇]有開窗呢?
這里使用group by進(jìn)行了分組,根據(jù)id和時(shí)間進(jìn)行分組。
那我們想是否上面也可以使用group by 而不使用開窗呢?
如下sql是否可以呢?
返回結(jié)果:
答案是不可以。因?yàn)槲覀僺elect了多個(gè)字段,所以我們要根據(jù)多個(gè)字段來(lái)分組,class相同再根據(jù)id分組,id相同再根據(jù)score分組。導(dǎo)致我們不能僅僅根據(jù)class分組,也就導(dǎo)致最后分組出來(lái)的數(shù)據(jù)除了class、id、score都相同的兩條數(shù)據(jù)能夠聚合,否則都是單條數(shù)據(jù)自己聚合。
所以我們要使用group by就只能選取單個(gè)字段
返回結(jié)果
調(diào)用window庫(kù)窗口函數(shù)即可創(chuàng)建windows窗口。
必須使用windows的編譯器,如VC,MS等等。
RegisterClassEx函數(shù):
該函數(shù)注冊(cè)在隨后調(diào)用CreateWindow函數(shù)和CreateWindowEx函數(shù)中使用的窗口類。 RegisterClass函數(shù)己經(jīng)由函數(shù)RegisterClassEx函數(shù)來(lái)代替,但是,如果不需要設(shè)置類的小目標(biāo)則仍然可以使用RegisterClass函數(shù)。
CreateWindowEx函數(shù):
該函數(shù)創(chuàng)建一個(gè)具有擴(kuò)展風(fēng)格的層疊式窗口、彈出式窗口或子窗口,其他與CreateWindow函數(shù)相同。關(guān)于創(chuàng)建窗口和其他參數(shù)的內(nèi)容,請(qǐng)參看CreateWindow。具體仍可見微軟的msdn。
消息處理函數(shù)WindowProc:
該函數(shù)是一個(gè)應(yīng)用程序定義的函數(shù)。它處理發(fā)送給窗口的消息。WINDPROC類型定義了一個(gè)指向該回調(diào)函數(shù)的指針。WindowProc是用于應(yīng)用程序定義函數(shù)的占位符。
函數(shù)原型:
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
參數(shù):
hwnd:指向窗口的句柄。
uMsg:指定消息類型。
wParam:指定其余的、消息特定的信息。該參數(shù)的內(nèi)容與UMsg參數(shù)值有關(guān)。
IParam:指定其余的、消息特定的信息。該參數(shù)的內(nèi)容與uMsg參數(shù)值有關(guān)。
返回值:返回值就是消息處理結(jié)果,它與發(fā)送的消息有關(guān)。
一個(gè)簡(jiǎn)單的Window的代碼如下:
#include?Windows.h
#include?tchar.h
LRESULT?WINAPI?WinProc(HWND?hWnd,UINT?Msg,WPARAM?wParam,LPARAM?lParam);
int?WinMain(?
__in?HINSTANCE?hInstance,?
__in_opt?HINSTANCE?hPrevInstance,?
__in?LPSTR?lpCmdLine,?
__in?int?nShowCmd?
)
{
TCHAR?*szName?=?_T("myWindow");
WNDCLASSEX?wc?=?{0};
HWND?hWnd?????=?NULL;
MSG?Msg???????=?{0};
wc.cbClsExtra????=?0;
wc.cbWndExtra????=?0;
wc.cbSize????????=?sizeof(WNDCLASSEX);
wc.hbrBackground?=?(HBRUSH)GetStockObject(WHITE_BRUSH);//通過(guò)函數(shù)來(lái)設(shè)置一個(gè)白色的背景,這里大家設(shè)置為NULL看看,會(huì)很有趣的
wc.hCursor???????=?NULL;//不設(shè)置
wc.hIcon?????????=?NULL;//不設(shè)置
wc.hIconSm???????=?NULL;//不設(shè)置
wc.hInstance?????=?hInstance;//當(dāng)前程序的句柄,hInstance是有系統(tǒng)給傳遞的
wc.lpfnWndProc???=?WinProc;//窗口處理過(guò)程的回調(diào)函數(shù)。
wc.lpszClassName?=?szName;//窗口類的名字。
wc.lpszMenuName??=?NULL;?
wc.style?????????=?CS_HREDRAW?|?CS_VREDRAW;?
RegisterClassEx(wc);//在系統(tǒng)中注冊(cè)
hWnd?=?CreateWindowEx(WS_EX_CLIENTEDGE,szName,_T("我的窗口我喜歡"),WS_OVERLAPPEDWINDOW,
200,100,600,400,NULL,NULL,hInstance,NULL);//創(chuàng)建窗口,窗口標(biāo)題為"我的窗口我喜歡"
if(hWnd?==?NULL)
{
MessageBox(NULL,_T("There's?an?Error"),_T("Error?Title"),MB_ICONEXCLAMATION|MB_OK);
return?0;
}
ShowWindow(hWnd,nShowCmd);//顯示窗口
UpdateWindow(hWnd);
//下面是對(duì)消息的循環(huán)處理,大家先不必管這些,下節(jié)課我會(huì)細(xì)說(shuō)的
while(GetMessage(Msg,NULL,0,0))
{
TranslateMessage(Msg);//翻譯消息
DispatchMessage(Msg);//分派消息
}
return?Msg.message;
}
//消息處理函數(shù)
LRESULT?WINAPI?WinProc(HWND?hWnd,UINT?Msg,WPARAM?wParam,LPARAM?lParam)
{
switch(Msg)//處理消息過(guò)程
{
case?WM_DESTROY://響應(yīng)鼠標(biāo)單擊關(guān)閉按鈕事件
PostQuitMessage(0);//退出消息隊(duì)列
return?0;//退出函數(shù)
}
return?DefWindowProc(hWnd,Msg,wParam,lParam);
}
要用C語(yǔ)言編寫一個(gè)窗體應(yīng)用程序需要調(diào)用系統(tǒng)或第三方提供的API函數(shù),一般的步驟是:
定義窗口類
注冊(cè)窗口類
創(chuàng)建窗口
顯示、更新窗口
進(jìn)行消息循環(huán),不斷處理窗口消息
文章題目:c語(yǔ)言使用開窗函數(shù) c語(yǔ)言窗口函數(shù)
分享網(wǎng)址:http://chinadenli.net/article24/dodcgje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、關(guān)鍵詞優(yōu)化、Google、網(wǎng)站維護(hù)、小程序開發(fā)、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)