2015-04-06 65 views
1

我想添加多線程的語言(BlitzBasic)不支持多線程或函數指針,而是從一個.dll獲取函數指針

語言的編譯器編譯成某種形式的不支持運行功能的C被編譯成本地代碼。它僅限於Windows。

到目前爲止,我的想法是在一個dll中創建一個函數,該函數將在BlitzBasic中調用。這個函數會檢查調用堆棧以找出調用堆棧的位置。然後它會分叉一個新線程並返回。新線程將等待一段時間(10ms左右),然後在BlitzBasic中函數被調用的位置恢復執行。在BlitzBasic中,你將不得不根據該延遲來控制執行的其餘部分(因此,第一個退出該函數的線程會設置一個變量,以告訴第二個線程執行一些不同的功能。)

我知道,多線程引入了很多其他的問題,但我會船到橋頭當我到達那裏。

有沒有找到一個函數的調用堆棧的執行點的方法嗎?

回答

1

在這種情況下函數指針是不夠的,因爲函數指針只允許你從頭開始調用函數,但你已經在函數的中間。

您可以使用setjmp/longjmp,但除非原始語言的設計考慮到線程安全性,否則您可能會遇到很多問題。

特別是如果你的語言有任何全局狀態,你將不得不圍繞它創建鎖。

就我個人而言,我只是使用堆棧本身來恢復,並有你的功能塊,直到它準備好返回。你仍然可以產生一個新的線程。這會容易很多。您也可以從更簡單的協作式線程模型開始,而不是先發制人。這可以讓你看看它是否可以工作。

1

這就好比setjmp and longjmp

你必須小心這些,因爲正常清潔快速退出不會發生。

1

您將不得不使用匯編語言。您需要一個彙編語言語言函數,它可以遍歷一個堆棧棧幀。

通常幀指針寄存器指向當前堆棧幀。然後你需要檢查幀並找到保存的幀指針(例程的調用者)。幀指針通常指向返回時執行的下一條指令的保存地址。