當前位置:首頁 » 編程軟體 » 多進程編程實例

多進程編程實例

發布時間: 2022-09-07 02:16:53

A. 嵌入式linux應用層開發有哪些實例

一:C語言 嵌入式Linux工程師的學習需要具備一定的C語言基礎,C語言是嵌入式領域最重要也是最主要的編程語言,通過大量編程實例重點理解C語言的基礎編程以及高級編程知識。包括:基本數據類型、數組、指針、結構體、鏈表、文件操作、隊列、棧等。
二:Linux基礎 Linux操作系統的概念、安裝方法,詳細了解Linux下的目錄結構、基本命令、編輯器VI ,編譯器GCC,調試器GDB和 Make 項目管理工具, Shell Makefile腳本編寫等知識,嵌入式開發環境的搭建。
三:Linux系統編程 重點學習標准I/O庫,Linux多任務編程中的多進程和多線程,以及進程間通信(pipe、FIFO、消息隊列、共享內存、signal、信號量等),同步與互斥對共享資源訪問控制等重要知識,主要提升對Linux應用開發的理解和代碼調試的能力。
四:Linux網路編程 計算機網路在嵌入式Linux系統應用開發過程中使用非常廣泛,通過Linux網路發展、TCP/IP協議、socket編程、TCP網路編程、UDP網路編程、Web編程開發等方面入手,全面了解Linux網路應用程序開發。重點學習網路編程相關API,熟練掌握TCP協議伺服器的編程方法和並發伺服器的實現,了解HTTP協議及其實現方法,熟悉UDP廣播、多播的原理及編程方法,掌握混合C/S架構網路通信系統的設計,熟悉HTML,javascript等Web編程技術及實現方法。
五:數據結構與演算法 數據結構及演算法在嵌入式底層驅動、通信協議、及各種引擎開發中會得到大量應用,對其掌握的好壞直接影響程序的效率、簡潔及健壯性。此階段的學習要重點理解數據結構與演算法的基礎內容,包括順序表、鏈表、隊列、棧、樹、圖、哈希表、各種查找排序演算法等應用及其C語言實現過程。
六:C++ 、QT C++是Linux應用開發主要語言之一,本階段重點掌握面向對象編程的基本思想以及C++的重要內容。圖形界面編程是嵌入式開發中非常重要的一個環節。由於QT具有跨平台、面向對象、豐富API、支持2D/3D渲染、支持XML、多國語等強大功能,在嵌入式領域的GUI開發中得到了廣范的應用,在本階段通過基於QT圖形庫的學習使學員可以熟練編寫GUI程序,並移植QT應用程序到Cortex-A8平台。包括IDE使用、QT部件及布局管理器、信息與槽機制的應用、滑鼠、鍵盤及繪圖事件處理及文件處理的應用。
七:Cortex A8 、Linux 平台開發 通過基於ARM Cortex-A8處理s5pv210了解晶元手冊的基本閱讀技巧,掌握s5pv210系統資源、時鍾控制器、電源管理、異常中斷控制器、nand flash控制器等模塊,為底層平台搭建做好准備。Linux平台包括內核裁減、內核移植、交叉編譯、GNU工具使用、內核調試、Bootloader介紹、製作與原理分析、根文件系統製作以及向內核中添加自己的模塊,並在s5pv210實驗平台上運行自己製作的Linux系統,集成部署Linux系統整個流程。同時了解Android操作系統開發流程。Android系統是基於Linux平台的開源操作系統,該平台由操作系統、中間件、用戶界面和應用軟體組成,是首個為移動終端打造的真正開放和完整的移動軟體,目前它的應用不再局限於移動終端,還包括數據電視、機頂盒、PDA等消費類電子產品。
八:驅動開發 驅動程序設計是嵌入式Linux開發工作中重要的一部分,也是比較困難的一部分。本階段的學習要熟悉Linux的內核機制、驅動程序與用戶級應用程序的介面,掌握系統對設備的並發操作。熟悉所開發硬體的工作原理,具備ARM硬體介面的基礎知識,熟悉ARM Cortex-A8處理器s5pv210各資源、掌握Linux設備驅動原理框架,熟悉工程中常見Linux高級字元設備、塊設備、網路設備、USB設備等驅動開發,在工作中能獨立勝任底層驅動開發。
以上就是列出的關於一名合格嵌入式Linux開發工程師所必學的理論知識,其實,作為一個嵌入式開發人員,專業知識和項目經驗同樣重要,所以在我們的理論學習中也要有一定的項目實踐,鍛煉自己的項目開發能力。

B. 並發編程數據共享有哪幾種機制如何保證數據同步

1、多進程並發
在傳統UNIX中較常用,針對每一種單獨的業務邏輯的實例生成不同的線程進行處理。典型的程序實例是針對TCP的多個不同的客戶端連接,fork出多個子進程進行處理,每一個客戶端對應一個單獨的子進程,在子進程處理退出後,由父進程回收其資源。
優點:各進程間的地址空間相互隔離,不會因為某些不當操作將整個應用搞掛。
業務邏輯代碼簡單清晰,代碼平鋪直敘,沒有復雜的非同步狀態邏輯。
缺點:如果需要在進程間進行交互或者共享數據,需要使用IPC。
2、多線程並發
在現代操作系統windows、linux中很常用,針對單獨的業務邏輯的不同的實例在同一個進程中創建多個線程進行並發處理。典型的例子是,TCP的多個客戶端在同一個進程中處理,針對每個客戶端都單獨對應的線程進行交互,共享同一個進程的所有資源。
優點:共享進程空間,訪問共享數據非常容易。
沒有多的進程空間開銷,線程上下文切換快,調度效率比多進程高。
業務邏輯代碼簡單清晰,代碼平鋪直敘,沒有復雜的非同步狀態邏輯。
缺點:維護線程的工作由進程內部代碼處理,比如線程數量,增加一定的復雜性。
線程間共享數據的競爭關系復雜,需要處理同步和死鎖問題。
3、IO多路復用
即在單線程式控制制多個非同步業務邏輯,也就是事件驅動多個業務的狀態處理,典型的有windows中的消息處理機制,還有linux中的信號量處理。可以在單一線程中,處理多種不同的業務邏輯,比如同時處理用戶輸出,滑鼠點擊,窗口重繪和網路輸入。
優點:所有業務實例的邏輯在單一線程中處理,排除代碼時序BUG,理論上不存在競爭和死鎖問題。
沒有多的進程空間開銷,也沒有上下文切換問題,CPU利用率高。
共享進程空間,訪問共享數據非常容易。
缺點:
線程需要管理多個不同實例的狀態機,並正確處理對應事件導致不同狀態的遷移。
業務種類多的情況下,需要人為代碼控制多種狀態機。
並發點越多造成狀態越多,管理粒度越細, 業務邏輯代碼不是順序的,不容易維護和理解。
非同步狀態過多,造成資源管理較為復雜,容易產生資源泄漏。

C. 什麼是java多線程詳解

線程對象是可以產生線程的對象。比如在Java平台中Thread對象,Runnable對象。線程,是指正在執行的一個指點令序列。在java平台上是指從一個線程對象的start()開始,運行run方法體中的那一段相對獨立的過程。相比於多進程,多線程的優勢有:
(1)進程之間不能共享數據,線程可以;
(2)系統創建進程需要為該進程重新分配系統資源,故創建線程代價比較小;
(3)Java語言內置了多線程功能支持,簡化了java多線程編程。
一、創建線程和啟動
(1)繼承Thread類創建線程類
通過繼承Thread類創建線程類的具體步驟和具體代碼如下:
• 定義一個繼承Thread類的子類,並重寫該類的run()方法;
• 創建Thread子類的實例,即創建了線程對象;
• 調用該線程對象的start()方法啟動線程。
復制代碼
class SomeThead extends Thraad {
public void run() {
//do something here
}
}

public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步驟3:啟動線程:
oneThread.start();
}
復制代碼
(2)實現Runnable介面創建線程類
通過實現Runnable介面創建線程類的具體步驟和具體代碼如下:
• 定義Runnable介面的實現類,並重寫該介面的run()方法;
• 創建Runnable實現類的實例,並以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象。
復制代碼
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
復制代碼
(3)通過Callable和Future創建線程
通過Callable和Future創建線程的具體步驟和具體代碼如下:
• 創建Callable介面的實現類,並實現call()方法,該call()方法將作為線程執行體,並且有返回值。
• 創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
• 使用FutureTask對象作為Thread對象的target創建並啟動新線程。
• 調用FutureTask對象的get()方法來獲得子線程執行結束後的返回值其中,Callable介面(也只有一個方法)定義如下:
復制代碼
public interface Callable {
V call() throws Exception;
}
步驟1:創建實現Callable介面的類SomeCallable(略);
步驟2:創建一個類對象:
Callable oneCallable = new SomeCallable();
步驟3:由Callable創建一個FutureTask對象:
FutureTask oneTask = new FutureTask(oneCallable);
注釋: FutureTask是一個包裝器,它通過接受Callable來創建,它同時實現了 Future和Runnable介面。
步驟4:由FutureTask創建一個Thread對象:
Thread oneThread = new Thread(oneTask);
步驟5:啟動線程:
oneThread.start();

D. 一個進程通信 的 linux程序編寫

學習步驟如下:

1、Linux 基礎

安裝Linux操作系統
Linux文件系統
Linux常用命令
Linux啟動過程詳解
熟悉Linux服務能夠獨立安裝Linux操作系統
能夠熟練使用Linux系統的基本命令
認識Linux系統的常用服務安裝Linux操作系統
Linux基本命令實踐
設置Linux環境變數
定製Linux的服務 Shell 編程基礎使用vi編輯文件
使用Emacs編輯文件
使用其他編輯器

2、Shell 編程基礎

Shell簡介
認識後台程序
Bash編程熟悉Linux系統下的編輯環境
熟悉Linux下的各種Shell
熟練進行shell編程熟悉vi基本操作
熟悉Emacs的基本操作
比較不同shell的區別
編寫一個測試伺服器是否連通的shell腳本程序
編寫一個查看進程是否存在的shell腳本程序
編寫一個帶有循環語句的shell腳本程序

3、Linux 下的 C 編程基礎

linux C語言環境概述
Gcc使用方法
Gdb調試技術
Autoconf
Automake
Makefile
代碼優化 熟悉Linux系統下的開發環境
熟悉Gcc編譯器
熟悉Makefile規則編寫Hello,World程序
使用 make命令編譯程序
編寫帶有一個循環的程序
調試一個有問題的程序

4、嵌入式系統開發基礎

嵌入式系統概述
交叉編譯
配置TFTP服務
配置NFS服務
下載Bootloader和內核
嵌入式Linux應用軟體開發流程
熟悉嵌入式系統概念以及開發流程
建立嵌入式系統開發環境製作cross_gcc工具鏈
編譯並下載U-boot
編譯並下載Linux內核
編譯並下載Linux應用程序
嵌入式系統移植
Linux內核代碼
平台相關代碼分析
ARM平台介紹
平台移植的關鍵技術
移植Linux內核到 ARM平台 了解移植的概念
能夠移植Linux內核移植Linux2.6內核到 ARM9開發板

5、嵌入式 Linux 下串口通信

串列I/O的基本概念
嵌入式Linux應用軟體開發流程
Linux系統的文件和設備
與文件相關的系統調用
配置超級終端和MiniCOM 能夠熟悉進行串口通信
熟悉文件I/O 編寫串口通信程序
編寫多串口通信程序

6、嵌入式系統中多進程程序設計

Linux系統進程概述
嵌入式系統的進程特點
進程操作
守護進程
相關的系統調用了解Linux系統中進程的概念
能夠編寫多進程程序編寫多進程程序
編寫一個守護進程程序
sleep系統調用任務管理、同步與通信 Linux任務概述
任務調度
管道
信號
共享內存
任務管理 API 了解Linux系統任務管理機制
熟悉進程間通信的幾種方式
熟悉嵌入式Linux中的任務間同步與通信
編寫一個簡單的管道程序實現文件傳輸
編寫一個使用共享內存的程序

7、嵌入式系統中多線程程序設計

線程的基礎知識
多線程編程方法
線程應用中的同步問題了解線程的概念
能夠編寫簡單的多線程程序編寫一個多線程程序

8、嵌入式 Linux 網路編程

網路基礎知識
嵌入式Linux中TCP/IP網路結構
socket 編程
常用 API函數
分析Ping命令的實現
基本UDP套介面編程
許可證管理
PPP協議
GPRS 了解嵌入式Linux網路體系結構
能夠進行嵌入式Linux環境下的socket 編程
熟悉UDP協議、PPP協議
熟悉GPRS 使用socket 編寫代理伺服器
使用socket 編寫路由器
編寫許可證伺服器
指出TCP和UDP的優缺點
編寫一個web伺服器
編寫一個運行在 ARM平台的網路播放器

9、GUI 程序開發

GUI基礎
嵌入式系統GUI類型
編譯QT
進行QT開發熟悉嵌入式系統常用的GUI
能夠進行QT編程使用QT編寫「Hello,World」程序
調試一個加入信號/槽的實例
通過重載QWidget 類方法處理事件

10、Linux 字元設備驅動程序

設備驅動程序基礎知識
Linux系統的模塊
字元設備驅動分析
fs_operation結構
載入驅動程序了解設備驅動程序的概念
了解Linux字元設備驅動程序結構
能夠編寫字元設備驅動程序編寫Skull驅動
編寫鍵盤驅動
編寫I/O驅動
分析一個看門狗驅動程序
對比Linux2.6內核與2.4內核中字元設備驅動的不同
Linux 塊設備驅動程序塊設備驅動程序工作原理
典型的塊設備驅動程序分析
塊設備的讀寫請求隊列了解Linux塊設備驅動程序結構
能夠編寫簡單的塊設備驅動程序比較字元設備與塊設備的異同
編寫MMC卡驅動程序
分析一個文件系統
對比Linux2.6內核與2.4內核中塊設備驅動的不同

11、文件系統

虛擬文件系統
文件系統的建立
ramfs內存文件系統
proc文件系統
devfs 文件系統
MTD技術簡介
MTD塊設備初始化
MTD塊設備的讀寫操作了解Linux系統的文件系統
了解嵌入式Linux的文件系統
了解MTD技術
能夠編寫簡單的文件系統為 ARM9開發板添加 MTD支持
移植JFFS2文件系統
通過proc文件系統修改操作系統參數
分析romfs 文件系統源代碼
創建一個cramfs 文件系統

E. 有什麼情況一定要, 只能是多線程編程才能解決 給個具體的例子, 我初學多線程...

這是典型的對多線程不理解造成的,問題本身就存在問題。

多線程只是一種技術——所以沒有所謂的必須,或是只能。

多線程有其自己的適用范圍,我們只能說在哪種情況下適合使用多線程,但這種情況下絕對不會是只有多線程能解決。所以問題就言是多線程的典型應用場景,而非這么絕對的問一定要,只能是!不信換一種結構——比如陣列處理器,人家編程時就使用了陣列,與線程的概念就沒有任何關系不了!

典型的使用場景其就是一個:充分利用IO資源。

比如說一個界面在工作時不停地接收輸入信息(如鍵盤,mouse,網卡等)而界面或是程序對信息處理時間較長時,最好使用多線程,多線程的意義在於在CPU參於界面處理的同時,可以處理輸入事件。如果單線程,你必須等待界面或是程序處理完成之後才可以處理輸入事件,而多線程為了防止這種界面或是程序假死的現象(單線程在處理界面時不接受事件)。

再者如果程序在運行過程中,由於要長時間地硬碟進行讀寫,那麼多線程也能很好地解決這一問題。

其實它的目的就是研究發現:單線程(進程)在CPU工作時可能造成其他IO資源(如磁碟IO)的空閑,而使用多線程則是合理利用IO資源,加快整個軟體的運行。

事實上了,windows系統是一個多任務多進程的工作,每個進程之間利用的是CPU時間輪片法。而線程之間則利用的多資源的同步進行。

所以說,多線程本身只是提高了IO利用率,與長時間處理什麼的其實也沒有多大關系。比如windows服務並非線程,但每個windows服務是一個進程,為什麼還都可以同時並發在系統中?這個原因就是CPU輪片。而多線程是基於進程所佔cpu時間片內的IO資源充分利用。

另一個技術也是線程延伸,就是我們常說的CPU是四核八線,其實他只是將每個物理核心再虛擬一個線程CPU,只不過這個所謂的四核八線CPU僅僅只是提高了CPU的利用率而已。

笑一樓與二樓,還扯什麼消息機制——這與系統與毛關系?都是大神啊!

其實在單核單線的CPU上,多線程除了增加線程開辟與回收等開銷外,對於CPU並不佔任何便宜。而多進程之間已經有CPU輪片法進行各進程的統籌了。

F. vc怎麼調用ansys

ANSYS基於VC++6.0的二次開發與
相互作用分析在ANSYS中的實現
1 概述
ANSYS是一套功能十分強大的有限元分析軟體,能實現多場及多場耦合分析;是實現前後處理、求解及多場分析統一資料庫的一體化大型FEA軟體;支持異種、異構平台的網路浮動,在異種、異構平台上用戶界面統一、數據文件全部兼容,強大的並行計算功能支持分布式並行及共享內存式並行。該軟體具有如下特點:
(1) 完備的前處理功能
ANSYS不僅提供了強大的實體建模及網格劃分工具,可以方便地構造數學模型,而且還專門設有用戶所熟悉的一些大型通用有限元軟體的數據介面(如MSC/NSSTRAN,ALGOR,ABAQUS等),並允許從這些程序中讀取有限元模型數據,甚至材料特性和邊界條件,完成ANSYS中的初步建模工作。此外,ANSYS還具有近200種單元類型,這些豐富的單元特性能使用戶方便而准確地構建出反映實際結構的模擬計算模型。
(2) 強大的求解器
ANSYS提供了對各種物理場量的分析,是目前唯一能融結構、熱、電磁、流體、聲學等為一體的有限元軟體。除了常規的線性、非線性結構靜力、動力分析外,還可以解決高度非線性結構的動力分析、結構非線性及非線性屈曲分析。提供的多種求解器分別適用於不同的問題及不同的硬體配置。
(3) 方便的後處理器
ANSYS的後處理分為通用後處理模塊(POST1)和時間歷程後處理模塊(POST26)兩部分。後處理結果可能包括位移、溫度、應力、應變、速度以及熱流等,輸出形式可以有圖形顯示和數據列表兩種。
(4) 多種實用的二次開發工具
ANSYS除了具有較為完善的分析功能外,同時還為用戶進行二次開發提供了多種實用工具。如宏(Marco)、參數設計語言(APDL)、用戶界面設計語言(UIDL)及用戶編程特性(UPFs),其中APDL(ANSYS Parametric Design Language)是一種非常類似於Fortran77的參數化設計解釋性語言,其核心內容為宏、參數、循環命令和條件語句,可以通過建立參數化模型來自動完成一些通用性強的任務;UIDL(User Interface Design Language)是ANSYS為用戶提供專門進行程序界面設計的語言,允許用戶改變ANSYS的圖形用戶界面(GUI)中的一些組項,提供了一種允許用戶靈活使用、按個人喜好來組織設計ANSYS圖形用戶界面的強有力工具;UPFs(User Programmable Features)提供了一套Fortran77函數和常式以擴展或修改程序的功能,該項技術充分顯示了ANSYS的開放體系,用戶不僅可以採用它將ANSYS程序剪裁成符合自己所需的任何組織形式(如可以定義一種新的材料,一個新的單元或者給出一種新的屈服准則),而且還可以編寫自己的優化演算法,通過將整個ANSYS作為一個子程序調用的方式實現。
鑒於上述特點,近幾年來,ANSYS軟體在國內外工程建設和科學研究中得到了廣泛的應用。但這些應用大多局限於直接運用ANSYS軟體進行實際工程分析,對利用ANSYS提供的二次開發工具進行有限元軟體設計卻很少涉及。本文首次利用ANSYS軟體的二次開發功能,以VC++6.0為工具,運用APDL語言,對ANSYS進行二次開發,編制框筒結構-樁筏基礎-土相互作用體系與地震反應分析程序。
2 程序設計目標
針對某一實際工程問題,ANSYS所提供的APDL語言可對ANSYS軟體進行封裝。APDL語言即ANSYS軟體提供的參數化設計語言,它的全稱是ANSYS Parametric Design Language。 使用APDL語言可以更加有效地進行分析計算,可以輕松地進行自動化工作(循環、分支、宏等結構),而且,它是一種高效的參數化建模手段。使用APDL語言進行封裝的系統可以只要求操作人員輸入前處理參數,然後自動運行ANSYS進行求解。但完全用APDL編寫的宏還存在弱點。比如用APDL語言較難控製程序的進程,雖然它提供了循環語句和條件判斷語句,但總的來說還是難以用來編寫結構清晰的程序。它雖然提供了參數的界面輸入,但功能還不是太強,交互性不夠流暢。針對這種情況,本文用VC++6.0開發框筒結構-樁筏基礎-土相互作用有限元分析程序(簡稱LWS程序)。
本程序設計目標是利用VC++6.0對ANSYS進行封裝。用VC++6.0對ANSYS模擬框筒結構-樁筏基礎-土相互作用進行二次開發,用戶只需輸入諸如地震波、計算時間步長、阻尼比等物理性能參數等,系統就能自動調用ANSYS計算程序,自動進行網格劃分、地震動載入以及自動求解。該系統由於前台開發友好、方便、易用的人機交互界面,對復雜的、難於理解和掌握的ANSYS命令流進行後台封裝,因此,程序設計可讓即使從未認真學習過ANSYS軟體的工程設計人員也能很好地藉助本系統進行結構抗震性能有限元分析,具有較強的處理實際問題能力。
用戶輸入計算參數,即可調用後台的ANSYS命令進行計算,ANSYS把計算結果返回給用戶,進行後處理。
程序設計的主要原則和功能如下:
(1)方便原則,即程序模塊應具有良好的用戶界面和易用性。程序前台設計採用Windows提供的標准圖形用戶界面(GUI),用戶無須接受專門訓練即可使用。同時,程序應具有良好的容錯和糾錯能力,避免用戶操作不當造成損失。
(2)程序系統能夠提供用戶以下功能:
①允許用戶可以根據實際計算工況,輸入特定的計算參數,包括地震波選擇、計算時間步長、地震波調幅與否等。
②用戶在輸入各種參數以後、進行計算之前可以對輸入的數據進行修改、添加和刪除操作,以保證輸入正確的參數。
③用戶通過界面調用後台的ANSYS命令流進行計算,能夠得到最後的計算結果文件,供用戶進行後處理和結果分析。
④用戶可以添加新的功能或新的二次開發以實現程序升級。
(3)程序應具有良好的可移植性,不依賴於特定的硬體設備,只要能安裝ANSYS和VC++6.0的硬體環境都能使用本系統,保證程序使用的廣泛性。
(4)程序代碼應具有開放性和可重用性。這樣,在進一步的設計中,能保證設計者可以方便地對代碼進行修改擴充;同時,提供一定的設計介面,新的設計者可以根據介面,無須對程序進行大幅度的修改,就可以進行新的開發,以適應新的特殊要求。
程序的開發平台是Microsoft VC++6.0、ANSYS6.1,基於WindowsXP編程。程序實現是利用微軟提供的Windows編程介面MFC和ANSYS公司的ANSYS/Multiphysics產品,採用面向對象的程序設計方法。
3程序的主要模塊和設計
如圖3-2所示,程序的主要模塊有:用戶界面模塊、ANSYS計算模塊、VC調用介面模塊和VC後處理模塊,分別論述如下:

3.1 ANSYS模塊
ANSYS為了滿足用戶的特殊需求,建立了開放的體系結構,提供了二次開發介面APDL、UIDL和UPFs(User Programming Features,用戶編程特性)等。其中,ANSYS介面允許用戶將自己的VC代碼連到ANSYS中去,或將ANSYS作為子程序調用,從而使ANSYS具備特殊的功能。
本文的ANSYS模塊是使用APDL語言進行二次開發的。在上面的二次開發中用到了參數化設計方法。參數是APDL的變數(它們更象FORTRAN變數,而不像FORTRAN參數),不必明確聲明參數類型,所有數值變數都以雙精度數存儲。被使用但未聲明的參數都被賦予接近0的「極小值」。在二次開發中使用參數化設計方法,增強了程序的易讀性和可移植性。用戶無須了解程序的具體結構只需改變參數值就可自動調用ANSYS模塊。
3.2 VC調用模塊
VC調用模塊在該系統中起著接受用戶界面的輸入、創建進程調用ANSYS模塊進行計算的重要作用。有兩項工作是在實現在VC程序中調用ANSYS必須做的,一是要使介面程序能夠修改ANSYSB的命令流文件路徑及文件名稱,這可通過注冊表編程實現;二是要能在介面程序中運行ANSYSB應用程序,這涉及到創建進程的編程,下面分別介紹它們的具體實現。
1. 注冊表編程
在Windows(98/NT/2000/XP)系統上運行ANSYS安裝程序後,便在Windows系統的注冊表裡記錄了一些信息,如初始工作路徑,文件名等。利用VC平台調用ANSYS計算模塊的程序必須指定ANSYS軟體的運行目錄以及用APDL語言開發的ANSYS模塊程序路徑,這樣,ANSYS軟體的批處理程序才能從給定的路徑下讀取命令流文件。在介面程序中修改這些注冊表信息,可以使用Windows提供的注冊表編輯API(Application Programming Interface)函數[30,31],具體實現如下:
HKEY hSubKey; // 定義子鍵
LONG lRet;
char RegPath[200]="SoftWare\\ANSYS, Inc.\\ANSYS\\ANSYS 6.1\\0";
lRet=RegOpenKeyEx(HKEY_CURRENT_USER,RegPath,0,KEY_ALL_ACCESS,&hSubKey); // 打開子鍵
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"Extension",0,REG_SZ,(LPBYTE)"txt",3); //設置ANSYS批處理程序讀取的文件擴展名
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"Jobname",0,REG_SZ,(LPBYTE)"ZHY");
//指定ANSYS模塊文件名
if(lRet!=ERROR_SUCCESS)return;
lRet=RegSetValueEx(hSubKey,"WorkingDirectory",0,REG_SZ,(LPBYTE)"E:\\LWS\\Workspace ",16);
if(lRet!=ERROR_SUCCESS)return; // 鍵值出錯返回
RegCloseKey(hSubKey); // 關閉子鍵
通過以上的設置後運行ANSYS批處理程序,界面變成如圖3-3所示。
從圖中可看出ANSYS模塊工作路徑E:\\LWS\\Workspace、初始文件名ZHY、ANSYS程序文件名ZHY.txt文件、計算結果輸出文件名ZHY.out都已經自動出現在ANSYS批處理程序的輸入框,往下ANSYS就可以自動從ZHY.txt讀取命令流進行計算並將結果輸出到ZHY.out文件中。若想改ANSYS模塊路徑或文件名只需對上面程序稍加修改即可。
2. 多進程編程
本文在VC平台上對ANSYS進行封裝,希望前台處理系統和用戶的交互,而後台進行ANSYS的計算。這就要求系統具有並發性,為此,引入多進程編程機制。進程是一個正在運行程序的實例,它具有動態性、並發性、獨立性、非同步性和結構性等特點。系統中的進程動態產生與消亡,多個進程並發運行,分別執行各自對應的程序段,為各自的目標而工作。一個程序可以包含多個進程。

圖3-3 ANSYS批處理運行界面
在VC++6.0中可以利用CreateProcess函數來創建一個進程去執行其他程序,而且可以設置該進程的優先順序。CreateProcess函數的原型是:
BOOL CreateProcess(
LPCTSTR lpAppliciatonName
LPTSTR lpCommandLine
LPSECURITY_ATTRIBUTES lpProcessAttributes
LPSECURITY_ATTRIBUTES lpThreadAttributes
BOOL bInheritHandles
DWORD dwCreationFlags
LPVOID lpEnvironment
LPCTSTR lpCurrentDirectory
LPSTARTUPINFO lpStartupInfo
LPPROCESS_INFORMATION lpProcessInformation
);
當系統調用CreateProcess時,會創建一個進程內核對象,其初始使用計數是1。該進程內核對象不是進程本身,而是操作系統管理進程時使用的一個較小的數據結構。然後,系統為新進程創建一個虛擬地址空間,並將可執行文件或任何必要的DLL文件的代碼和數據載入到該進程的地址空間中。接著,系統為新進程的主線程創建一個線程內核對象(其使用計數為1)。與進程內核對象一樣,線程內核對象也是操作系統用來管理線程的小型數據結構。通過執行C/C++運行期啟動代碼,該主線程便開始運行,它最終調用WinMain、wWinMain、main或wmain函數。如果系統成功創建了新進程和主線程,CreateProcess便返回True。
PszApplicationName和pszCommandLine參數分別用於設定新進程將要使用的可執行文件的名字和傳遞給新進程的命令行字元串。PszApplicationName的參數可以是NULL,表示系統將使用全路徑來查看可執行文件,並且不再搜索這些目錄;如果參數不是NULL可以將地址傳遞給pszApplicationName參數中包含可運行的文件的名字字元串。當系統找到了可執行文件後,就創建一個新進程,並將可執行文件的代碼和數據映射到新進程的地址空間中。
PsaProcess和psaThread參數分別設定進程對象和線程對象需要的安全性。可以為這些參數傳遞NULL,這種情況下,系統為這些對象賦予默認安全性描述符;也可以指定兩個SECURITY_ATTRIBUTES結構,並對它們進行初始化,以便創建自己的安全性許可權,並將它們賦予進程對象和線程對象。將SECRURITY_ATTRIBUTES 結構用於psaProcess和psaThread參數的另一個原因是,父進程將來生成的任何子進程都可以繼承這兩個對象句柄中的任何一個。本程序除了創鍵調用ANSYS計算模塊的進程外,無需再創建其它進程,因而,psaProcess和psaThread參數都為NULL。同理,binheritHandles參數為FALSE。
fdwCreate參數用於標識標志,以便用於規定如何來創建新進程,fdwCreate參數也可以用來設定優先順序類,不過對於大多數應用程序來說不應該這樣做,因為系統會為新進程賦予一個默認優先順序。
PszCurDir參數允許父進程設置子進程的當前驅動器和目錄。如果本參數為NULL,則新進程的工作目錄將與生成新進程的應用程序的目錄相同;若不為空,則必須指向包含需要的工作驅動器和工作目錄的以0結尾的字元串。課題中該參數選擇為NULL就可以了。
PsiStartInfo參數用於指向一個STARTUPINFO結構。當Windows創建新進程時,它將使用該結構的有關成員。大多數應用程序將要求生成的應用程序僅僅使用默認值。至少應該將該結構中的所有成員初始化為零,然後將cb(cb為STARTUPINFO結構成員)設置為該結構的大小。STARTUPINFO結構的其他具體成員參見VC++6.0幫助系統MSDN。
PpiProcInfo參數用於指向你必須指定的PROCESS_INFORMATION結構。CreateProcess在返回之前要對該結構的成員進行初始化。該結構的形式如下面所示:
Typedef struct _PROCESS_INFORMATION{
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}PROCESS_INFORMATION;
CreateProcess在返回之前打開進程對象和線程對象,並將每個對象的與進程相關的句柄放入PROCESS_INFORMATION結構的hProcess和hThread成員中。
綜上所述,課題創建進程的關鍵程序如下:
STARTUPINFO StartupInfo;
PROCESS_INFORMATION ProcessInfo;
memset(&StartupInfo,0,sizeof(STARTUPINFO)); //分配內存
StartupInfo.cb=sizeof(STARTUPINFO); // 初始化
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_SHOWMAXIMIZED;
if(!::CreateProcess(NULL,d:\\ProgramFiles\\Ansys
Inc\\ANSYS61\\bin\\intel\\AnsysB」,NULL,NULL,FALS E,0,NULL,NULL,&StartupInfo,&ProcessInfo))
{
AfxMessageBox("error!");
GetLastError();
} // 創建進程
3. 進程的終止
要終止進程的運行可以使用如下四種方法:①主線程的進入點函數返回;②進程中的一個線程調用ExitProcess函數;③另一個進程中的線程調用TerminateProcess函數;④所有進程中的線程自動終止運行(這種情況一般不會發生)。本文採用第一種方法終止所創建的進程,即當ANSYS計算結束時通過函數返回。
在WindowsXP系統中,如果ANSYS批處理程序運行完後,窗口標題會顯示「ANSYS已完成」。本文程序開發便可通過這一特點來終止系統所創建的進程。當ANSYS計算模塊運行完畢後,系統會彈出一個消息框提示ANSYS已計算完畢,可以進行後處理了。
3.3.3 用戶界面介面模塊
用戶界面模塊主要完成系統和用戶的交互。用戶界面模塊包括計算參數輸入和程序調用兩部分。計算參數輸入部分的主要功能是負責輸入諸如地震波數據、是否調幅、時間步長等。計算輸入是由對話框構成。計算參數輸入對話框界面如下:

圖3-4 計算參數輸入界面
程序對各參數的輸入范圍都進行了設定,如果用戶輸入的參數超過了這一設定,系統就會彈出對話框以提醒用戶輸入錯誤,需要重新輸入。ANSYS程序調用通過菜單方式進行。該菜單首先不處於激活狀態,而是當三維數值模擬所需參數輸入完成後才得到消息激活菜單。這樣設計的優點:能夠提醒用戶輸入並檢查用於三維數值模擬的相關參數,避免用戶在不輸入參數的情況下直接調用ANSYS進行計算而造成錯誤。
程序設計採用文檔讀寫的方式將輸入的計算參數插入到用APDL語言進行二次開發的ANSYS計算模塊。參數化設計的ANSYS計算模塊就可以根據輸入的參數進行數值模擬計算。
3.3.4 ANSYS後處理模塊的二次開發
ANSYS軟體提供了兩個後處理器,可以對結果進行時間-歷程後處理
和通用後處理。對於相互作用體系地震反應分析,它可以將模擬結果用應力圖、等值線(面)、動畫等形式輸出與轉換。其中POST1通用後處理器可用於觀察整個模型或模型的一部分在某一時間的模擬結果,可顯示結構在地震作用下的應力圖和位移變形圖;時間—歷程後處理器POST26用於檢查模型中指定點的分析結果與時間的函數關系,可顯示模型上各個節點的各變數的時程曲線。可見,對於大多數的後處理分析我們可以直接使用ANSYS的後處理器。但由於ANSYS是一個通用軟體,而對某些特殊領域的後處理分析無能為力或者不是很方便,因而,需要對其進行二次開發,以減輕後處理工作和提高後處理效率。
在相互作用體系地震反應分析中,有時除了關注各物理量時程曲線外,還關心其在結構高度方向的分布(如層間位移、層間剪力、層間加速度反應等)。解決這一問題的二次開發需要結合相互作用體系地震反應分析特點進行。
(1)物理量分析
在地震反應時程分析中,我們對樓層位移時程、加速度時程、柱應力應變時程 、剪力牆應力應變時程比較關心,同時還需要分析層間位移和層間加速度變化。考慮到本文將計算多種工況,本程序對常見的變數編寫了後處理程序,具有通用性,極大地提高了後處理效率。
(2) 程序實現
基於上面分析,本程序是通過介面程序調用ANSYS,讀入編寫的後處理命令流,讀取ANSYS計算的結果資料庫,生成各變數的結果文件,然後用本程序的後處理模塊進行讀數繪圖處理,進而生成結果圖形。這一過程採用VC編程實現的,VC編程的演算法流程圖如圖3-2的後處理模塊。(轉貼)

G. 多線程 python和多進程的區別

前面的章節,我們剛剛介紹過socket和socketserver網路編程。

在socketserver服務端代碼中有這么一句:

server = socketserver.ThreadingTCPServer((ip,port), MyServer)

ThreadingTCPServer這個類是一個支持多線程和TCP協議的socketserver,它的繼承關系是這樣的:

class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

右邊的TCPServer實際上是主要的功能父類,而左邊的ThreadingMixIn則是實現了多線程的類,ThreadingTCPServer自己本身則沒有任何代碼。

MixIn在Python的類命名中很常見,稱作「混入」,戲稱「亂入」,通常為了某種重要功能被子類繼承。

我們看看一下ThreadingMixIn的源代碼:

class ThreadingMixIn:

daemon_threads = False

def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.shutdown_request(request)
except:
self.handle_error(request, client_address)
self.shutdown_request(request)

def process_request(self, request, client_address):

t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
t.daemon = self.daemon_threads
t.start()

在ThreadingMixIn類中,其實就定義了一個屬性,兩個方法。其中的process_request()方法實際調用的正是Python內置的多線程模塊threading。這個模塊是Python中所有多線程的基礎,socketserver本質上也是利用了這個模塊。

socketserver通過threading模塊,實現了多線程任務處理能力,可以同時為多個客戶提供服務。

那麼,什麼是線程,什麼是進程?

進程是程序(軟體,應用)的一個執行實例,每個運行中的程序,可以同時創建多個進程,但至少要有一個。每個進程都提供執行程序所需的所有資源,都有一個虛擬的地址空間、可執行的代碼、操作系統的介面、安全的上下文(記錄啟動該進程的用戶和許可權等等)、唯一的進程ID、環境變數、優先順序類、最小和最大的工作空間(內存空間)。進程可以包含線程,並且每個進程必須有至少一個線程。每個進程啟動時都會最先產生一個線程,即主線程,然後主線程會再創建其他的子線程。

線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不獨立擁有系統資源,但它可與同屬一個進程的其它線程共享該進程所擁有的全部資源。每一個應用程序都至少有一個進程和一個線程。在單個程序中同時運行多個線程完成不同的被劃分成一塊一塊的工作,稱為多線程。

舉個例子,某公司要生產一種產品,於是在生產基地建設了很多廠房,每個廠房內又有多條流水生產線。所有廠房配合將整個產品生產出來,單個廠房內的流水線負責生產所屬廠房的產品部件,每個廠房都擁有自己的材料庫,廠房內的生產線共享這些材料。公司要實現生產必須擁有至少一個廠房一條生產線。換成計算機的概念,那麼這家公司就是應用程序,廠房就是應用程序的進程,生產線就是某個進程的一個線程。

線程的特點:

線程是一個execution context(執行上下文),即一個cpu執行時所需要的一串指令。假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時繼續先前的進度。有一個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。

線程的工作方式與此類似。CPU會給你一個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上CPU同一時刻只能幹一件事,所謂的多線程和並發處理只是假象。CPU能這樣做是因為它有每個任務的execution context,就像你能夠和你朋友共享同一本書一樣。

進程與線程區別:

  • 同一個進程中的線程共享同一內存空間,但進程之間的內存空間是獨立的。

  • 同一個進程中的所有線程的數據是共享的,但進程之間的數據是獨立的。

  • 對主線程的修改可能會影響其他線程的行為,但是父進程的修改(除了刪除以外)不會影響其他子進程。

  • 線程是一個上下文的執行指令,而進程則是與運算相關的一簇資源。

  • 同一個進程的線程之間可以直接通信,但是進程之間的交流需要藉助中間代理來實現。

  • 創建新的線程很容易,但是創建新的進程需要對父進程做一次復制。

  • 一個線程可以操作同一進程的其他線程,但是進程只能操作其子進程。

  • 線程啟動速度快,進程啟動速度慢(但是兩者運行速度沒有可比性)。

由於現代cpu已經進入多核時代,並且主頻也相對以往大幅提升,多線程和多進程編程已經成為主流。Python全面支持多線程和多進程編程,同時還支持協程。

H. 如何理解python的多線程編程

線程是程序員必須掌握的知識,多線程對於代碼的並發執行、提升代碼效率和運行都至關重要。今天就分享一個黑馬程序員Python多線程編程的教程,從0開始學習python多任務編程,想了解python高並發實現,從基礎到實踐,通過知識點 + 案例教學法幫助你想你想迅速掌握python多任務。

課程內容:

1.掌握多任務實現的並行和並發

2.掌握多進程實現多任務

3.掌握多線程實現多任務

4.掌握合理搭配多進程和線程

適用人群:

1、對python多任務編程感興趣的在校生及應屆畢業生。

2、對目前職業有進一步提升要求,希望從事python人工智慧行業高薪工作的在職人員。

3、對python人工智慧行業感興趣的相關人員。

基礎課程主講內容包括:

1.python多任務編程

基礎班課程大綱:

00-課程介紹

01-多任務介紹

02-進程介紹

03-使用多進程來完成多任務

04-多進程執行帶有參數的任務

05-獲取進程的編號

06-進程注意點

07-案例-多進程實現傳智視頻文件夾多任務拷貝器

08-線程介紹

09-使用多線程執行多任務

10-線程執行帶有參數的任務

11-主線程和子線程的結束順序

12-線程之間的執行順序是無序

13-線程和進程的對比

14-案例-多線程實現傳智視頻文件夾多任務拷貝器

15-課程總結

I. 舉一個例子,說明一個程序可能同時屬於多個進程

不是程序屬於進程這么說滴.樓主你概念搞錯了了.

進程是在自身的虛擬地址空間正在運行的一個程序
程序運行產生進程
程序是一組靜態的指令集,不佔用系統運行資源
進程是隨時都可能發生變化的,動態的.佔用系統運行資源的程序
一個程序可以產生多個進程.

以上是我引用的一段話,簡而言之就是,進程是程序的實例,一個程序可以有多個實例,但一個實例只能對應一個進程;呵呵,可能不太恰當,

J. Excel 如何實現excel打開多個文件是多進程

編程才行,不斷的實例化excel進程,我還真測試過,效率奇低,用的時間是一個進程內打開的5到10倍

熱點內容
中國彩票的網是什麼密碼 發布:2025-03-21 07:25:06 瀏覽:441
蘋果稅與安卓哪個收費更狠 發布:2025-03-21 07:17:52 瀏覽:294
通過一個ip訪問兩台伺服器嗎 發布:2025-03-21 07:06:12 瀏覽:522
怎麼讓伺服器查不到我的ip地址 發布:2025-03-21 07:05:27 瀏覽:184
編譯器有什麼用 發布:2025-03-21 07:00:24 瀏覽:78
android百度雲盤 發布:2025-03-21 06:59:47 瀏覽:260
青雲存儲 發布:2025-03-21 06:50:03 瀏覽:403
王者榮耀有腳本嗎 發布:2025-03-21 06:50:00 瀏覽:806
c語言代碼運行 發布:2025-03-21 06:49:17 瀏覽:560
python打開文件夾下所有文件 發布:2025-03-21 06:44:34 瀏覽:951