主頁 > 軟體工程 > 怎樣取得CreateThread創建執行緒的函式的反回值

怎樣取得CreateThread創建執行緒的函式的反回值

2020-09-15 20:28:59 軟體工程

比如:
Dim hThread As Long, hThreadID As Long, Tcm As Long
MciCommand = "play C:\WINDOWS\Media\chimes.wav"
Lb = LoadLibrary("winmm.dll")   '載入模塊
ProcAdd = GetProcAddress(Lb, "mciExecute")  '取得函式入口
hThread = CreateThread(ByVal 0&, ByVal 0&, ProcAdd, ByVal MciCommand, ByVal 0&, hThreadID)     '創建執行緒

mciExecute這個函式會回傳一個long的值,要怎樣才可以取得

uj5u.com熱心網友回復:

API函式: GetExitCodeThread( )

樓主查一下相差資訊吧。

uj5u.com熱心網友回復:

Function GetExitCodeThread Lib "Kernel32" (ByVal hThread As Long, ByRef ExitCode As Long) As Long

如果API呼叫執行成功,ExitCode的回傳值是 STILL_ACTIVE 表示執行緒還沒有結束(還在執行中)。

uj5u.com熱心網友回復:

不是的,我不是要CreateThread這個的回傳值,我是想要CreateThread呼叫的函式的回傳值,也是就CreateThread的第三個引數對應的函式的回傳值。

uj5u.com熱心網友回復:

CreateThread( ) 的“第三個引數”,是“輸入引數”,不是用來“回傳資料”的!


注意:VB6的“API瀏覽器”帶的宣告資訊 Win32API.txt ,它的第3個引數形式宣告是錯誤的(某些“修改版”同樣的錯誤)!
  VB6中應該加上 ByVal 才對!在Win32API.txt中是沒有指定“傳遞方式”的,那就是默認的ByRef傳遞。
若不更正,如果要“正確傳遞”,那么就要在呼叫CreateThread( ) 陳述句的第3個引數前加ByVal,
  否則傳入的不是“函式地址”,而是傳入的“變數地址”或“臨時變數的地址”了。
可以查閱MSDN,仔細“理解”那個引數的作用,可以看到它是“輸入”用的、是“函式入口首址”。

你要得到那個“函式回傳值”,就是需要通過我在樓上說的那個API函式 !
在執行緒創建成功、并且執行緒函式被正常執行完成后,這個“函式”就有一個“回傳值”,
  而這個值就需要用 GetExitCodeThread( ) 才能獲取!

uj5u.com熱心網友回復:

CreateThread
The CreateThread function creates a thread to execute within the address space of the calling process. 

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // pointer to security attributes
  DWORD dwStackSize,                         // initial thread stack size
  LPTHREAD_START_ROUTINE lpStartAddress,     // pointer to thread function
  LPVOID lpParameter,                        // argument for new thread
  DWORD dwCreationFlags,                     // creation flags
  LPDWORD lpThreadId                         // pointer to receive thread ID
);
 
Parameters
lpThreadAttributes 
Pointer to a SECURITY_ATTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If lpThreadAttributes is NULL, the handle cannot be inherited. 
Windows NT: The lpSecurityDescriptor member of the structure specifies a security descriptor for the new thread. If lpThreadAttributes is NULL, the thread gets a default security descriptor. 

dwStackSize 
Specifies the initial commit size of the stack, in bytes. The system rounds this value to the nearest page. If this value is zero, or is smaller than the default commit size, the default is to use the same size as the calling thread. For more information, see Thread Stack Size. 
lpStartAddress 
Pointer to the application-defined function of type LPTHREAD_START_ROUTINE to be executed by the thread and represents the starting address of the thread. For more information on the thread function, see ThreadProc. 
lpParameter 
Specifies a single 32-bit parameter value passed to the thread. 
dwCreationFlags 
Specifies additional flags that control the creation of the thread. If the CREATE_SUSPENDED flag is specified, the thread is created in a suspended state, and will not run until the ResumeThread function is called. If this value is zero, the thread runs immediately after creation. At this time, no other values are supported. 
lpThreadId 
Pointer to a 32-bit variable that receives the thread identifier. 
Windows NT: If this parameter is NULL, the thread identifier is not returned. 

Windows 95 and Windows 98: This parameter may not be NULL. 

Return Values
If the function succeeds, the return value is a handle to the new thread.

If the function fails, the return value is NULL. To get extended error information, call GetLastError. 

Windows 95 and Windows 98: CreateThread succeeds only when it is called in the context of a 32-bit program. A 32-bit DLL cannot create an additional thread when that DLL is being called by a 16-bit program.

Remarks
The new thread handle is created with THREAD_ALL_ACCESS to the new thread. If a security descriptor is not provided, the handle can be used in any function that requires a thread object handle. When a security descriptor is provided, an access check is performed on all subsequent uses of the handle before access is granted. If the access check denies access, the requesting process cannot use the handle to gain access to the thread. 

The thread execution begins at the function specified by the lpStartAddress parameter. If this function returns, the DWORD return value is used to terminate the thread in an implicit call to the ExitThread function. Use the GetExitCodeThread function to get the thread's return value. 

The CreateThread function may succeed even if lpStartAddress points to data, code, or is not accessible. If the start address is invalid when the thread runs, an exception occurs, and the thread terminates. Thread termination due to a invalid start address is handled as an error exit for the thread's process. This behavior is similar to the asynchronous nature of CreateProcess, where the process is created even if it refers to invalid or missing dynamic-link libraries (DLLs). 

The thread is created with a thread priority of THREAD_PRIORITY_NORMAL. Use the GetThreadPriority and SetThreadPriority functions to get and set the priority value of a thread. 

When a thread terminates, the thread object attains a signaled state, satisfying any threads that were waiting on the object. 

The thread object remains in the system until the thread has terminated and all handles to it have been closed through a call to CloseHandle. 

The ExitProcess, ExitThread, CreateThread, CreateRemoteThread functions, and a process that is starting (as the result of a call by CreateProcess) are serialized between each other within a process. Only one of these events can happen in an address space at a time. This means that the following restrictions hold: 

During process startup and DLL initialization routines, new threads can be created, but they do not begin execution until DLL initialization is done for the process. 
Only one thread in a process can be in a DLL initialization or detach routine at a time. 
ExitProcess does not return until no threads are in their DLL initialization or detach routines. 
A thread that uses functions from the C run-time libraries should use the beginthread and endthread C run-time functions for thread management rather than CreateThread and ExitThread. Failure to do so results in small memory leaks when ExitThread is called. 

Windows CE: The lpThreadAttributes parameter must be set to NULL. The dwStackSize parameter must be zero. Only zero or CREATE_SUSPENDED values are supported for the dwCreationFlags parameter.

QuickInfo
  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.01 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.

See Also
Processes and Threads Overview, Process and Thread Functions, CloseHandle, CreateProcess, CreateRemoteThread, ExitProcess, ExitThread, GetExitCodeThread, GetThreadPriority, ResumeThread, SetThreadPriority, SECURITY_ATTRIBUTES, ThreadProc 

 

uj5u.com熱心網友回復:

出差才回來

Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
這是CreateThread 定義,和你說的一樣

GetExitCodeThread這個不是取執行緒狀態的函式嗎

我想問的是:  GetExitCodeThread 創建了一個執行緒,這個執行緒呼叫了 mciExecute 這個API,現在需要得到 mciExecute 這個的回傳值

uj5u.com熱心網友回復:

參考 6 樓 sxqvb 的回復:
出差才回來

Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
這是CreateThread 定義,和你說的一樣

GetExitCodeThread這個不是取執行緒狀態的函式嗎

我想問的是:  GetExitCodeThread 創建了一個執行緒,這個執行緒呼叫了 mciExecute 這個API,現在需要得到 mciExecute 這個的回傳值


看清楚:GetExitCodeThread → Get Exit Code Threaed 
簡單的“望文生義”,也知道不是“取執行緒狀態”啊…………

自己看看“百度百科”中的介紹啊,那是中文的,你不會說“不認識漢字”吧。

uj5u.com熱心網友回復:

樓主問的是,創建一個執行緒,呼叫執行緒中的函式,希望獲取函式的回傳值。

uj5u.com熱心網友回復:

說實話。。。 我覺得這種呼叫方式有點bt。。。
單開一個執行緒只為呼叫一個api,是為了異步嗎?
而且常規方法肯定是不可能得到你想要的內容的

uj5u.com熱心網友回復:

《Windows核心編程》
《深入決議Windows作業系統-Windows Internals》

uj5u.com熱心網友回復:

已經把你“指引到門口”了,還不能明白,我也只能呵呵了…………

uj5u.com熱心網友回復:


    Dim x As Long
    x = Me.hwnd

    Lb = LoadLibrary("user32.dll")              '載入模塊
    ProcAdd = GetProcAddress(Lb, "IsWindow")    '取得函式入口(判斷是不是視窗)

    hThread = CreateThread(ByVal 0&, ByVal 0&, ByVal ProcAdd, ByVal x, ByVal 0&, hThreadID)     '創建執行緒
  
    WaitObj = WaitForSingleObject(hThread, INFINITE)    '等待執行緒結束

    Dim Tcm As Long
    GetExitCodeThread hThread, Tcm  '取執行緒的反回值
    Debug.Print Tcm
 
    FreeLibrary Lb



上面這個代碼,只呼叫有一個引數和一個反回值的API, 如查x是一個有效的視窗句柄,會列印出來1,如果不是有效的視窗句柄會列印出來0,不知道這是不是IsWindow這個函式的回傳值。

uj5u.com熱心網友回復:

我在上面已經說的很直接了。
都到這步程度了,竟然還說“不知道這是不是IsWindow這個函式的回傳值”……


樓主,我建議你以后到CSDN,逛這個版塊吧: http://bbs.csdn.net/forums/FreeZone
編程技術的版塊不適合你。

uj5u.com熱心網友回復:

既然你這么勵害,那你給我說說我想傳多個叁數要怎么作呢

uj5u.com熱心網友回復:

直接傳給“執行緒”的引數,只能是1個,這是“約定”、是別人定好的“游戲規則”,
  如果你“要走這條路”,那就是無法改變的事實!

但是,它不會去管你這“1個引數”具體的是什么含義。
 也許這剛好是我需要傳遞的一個資料值;
 也有可能什么都不是,只是因為“要填補空缺”而已,這個“引數”我根本就不需要……

以“Win32環境”來說(就比如VB6吧,其它開發環境也可以參考),那個“執行緒引數”是個“32位數”,
但需要傳遞“2個、或更多個引數”,是不能直接通過CreateThread( )傳遞的。
不過,其實“多個引數”,可以事先處理、放到一個“1維陣列”中,而這個“執行緒引數”則是傳遞它的“資料首址”;
在“執行緒函式”中,按“約定順序”和資料首址值,依次取出資料就行了。
當然這種情況需要“自己包裝”一下,以便于正確接收及還原傳入的引數,
 肯定不能象你上面12樓那樣,直接用到系統的(或其它第三方DLL的)API函式上。
用這種方式“包裝”,別說三個引數,就是300個也沒問題。并且可以是不同型別的引數混合的……

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/49975.html

標籤:API

上一篇:錯誤提示Else沒有If

下一篇:rsa加密

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more