Fortran Coder

查看: 16267|回复: 11

[绘图界面库] 进行大量计算时GUI界面程序未响应

[复制链接]

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
发表于 2016-8-24 14:36:07 | 显示全部楼层 |阅读模式
编好的软件在运行过程中,点解软件的界面框时,经常出现程序未响应,这个怎么破解?是不是需要分配CPU的操作呀。一个负责界面,一个负责运算,希望搞得不要太高深,第一张程序未响应的图片,如果出现程序未响应直接会出现绘图区绘图也出不来。第二张是正常的
1.PNG
2.PNG

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

发表于 2016-8-24 15:24:45 | 显示全部楼层
多进程呗~GUI作为主进程,计算过程再开一个子进程,再复杂一点的话,绘图部分也开一个子进程
GUI使用C#或者Python、Java编写的话,百度一下就能找到很多参考答案

709

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
596 元
贡献
305 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2016-8-24 15:29:07 | 显示全部楼层
你需要用多线程(或多进程)操作。
GUI必须有一个线程(通常是主线程,用来相应鼠标移动,窗口最大化最小化,窗口被遮挡后刷新窗口等等)
实际进行较长时间的后台计算时,应该开辟新的线程。否则GUI可能就会不响应。

关于多线程编程,应该有不少资料可以看。

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
 楼主| 发表于 2016-8-24 17:09:05 | 显示全部楼层
好的 谢谢了 看来要学习一下GUI的资料了 谢谢提示

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
 楼主| 发表于 2016-8-26 10:38:48 | 显示全部楼层
楚香饭 发表于 2016-8-24 15:29
你需要用多线程(或多进程)操作。
GUI必须有一个线程(通常是主线程,用来相应鼠标移动,窗口最大化最小化 ...

[Fortran] 纯文本查看 复制代码
              PROGRAM PROGRESS
        !
              USE WINTERACTER
              USE RESID
              use One_D_Argumnet
              IMPLICIT NONE
        !  Number of iterations parameter
              TYPE(WIN_MESSAGE)  :: MESSAGE
              INTEGER            ::ITER1,ITER2,ITER3,CALCU_1D,CALCU_2D,CALCU
              CHARACTER(LEN=2)   :: CRESULT
              LOGIcal            :: QUIT=.FALSE.,login=.false.
              INTEGER            ::ITYPE
             
         CALL WInitialise()
        
        !主程序窗口
    
            CALL WindowOpen(FLAGS =1+2+4+8,MENUID=IDM_MENU1,DIALOGID=IDD_DIALOG1,TITLE="HELLOThe Laser Heating Calculation System V1.0.0")
            CALL IGrSelect(DrawField,IDF_PICTURE2)
            CALL WDialogColour(IDF_LASER_POW,RGB_RED) 
        !****************************************************
100        DO WHILE(.NOT.QUIT)
            
              CALL calc_itme      !加载计算序列号
           
                 CASE (PushButton)  
                  SELECT CASE (MESSAGE%VALUE1)  
                  CASE (IDRUN) 
                      IF (ISTATE==2) THEN
                          CALL WMessageBox(OKONLY,InformationIcon,CommonOK,'Wrong','CAUTION') 
                           QUIT = .FALSE.     
                      ELSE IF(ISTATE==1) THEN
                          !$OMP WORKSHAR
                          Call calc_itme_modify   !这部分是程序的求解部分,我加了 !$OMP WORKSHAR 和 !$OMP end WORKSHAR
                                                   !这个语句对是在第二个线程运行吗? 因为有矩阵的运算所以是用的这个语句对
                          CALL get_property 
                          CALL slov_pro
                          QUIT = .FALSE.
                          !$OMP end WORKSHAR
                      END IF
                  CASE (IDCANCEL)
                        QUIT = .TRUE.
                  END SELECT
              END SELECT
           END DO
              CALL WindowClose()
              STOP
            END PROGRAM PROGRESS



加了这个线程后 好像并没与什么改善,是不是我的循环量太大呀,5万多个循环的(20,20)二维数据的AX=B线性方程的求解

490

帖子

4

主题

0

精华

大宗师

F 币
3298 元
贡献
1948 点

水王勋章元老勋章热心勋章

发表于 2016-8-26 11:06:45 | 显示全部楼层
大头鼹鼠 发表于 2016-8-26 10:38
[mw_shl_code=fortran,true]
              PROGRAM PROGRESS
        !

lz没有搞明白进程process和线程thread的区别,GUI需要的是两个人在同一个食堂分两桌吃饭,而OMP是两个人在同一个食堂凑一桌吃饭
传送门:
线程和进程的区别是什么? - 进程 - 知乎
http://www.zhihu.com/question/25532384
进程与线程的一个简单解释 - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

1948

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1298 元
贡献
547 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2016-8-26 11:15:20 | 显示全部楼层
楼主可以看看周振红的书《Intel Visual Fortran 应用程序开发》,上面有专门的多线程的章节。
(虽然我很不喜欢这本书)
你可能会用到一个叫 CreateThread 的函数。
OpenMP 是另外的概念。早在它出现之前,多线程就已经大面积应用了。

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
 楼主| 发表于 2016-8-26 12:47:26 | 显示全部楼层
pasuka 发表于 2016-8-26 11:06
lz没有搞明白进程process和线程thread的区别,GUI需要的是两个人在同一个食堂分两桌吃饭,而OMP是两个人 ...

写的很明白 谢谢 多学习 你们都是学计算机的吗?

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
 楼主| 发表于 2016-8-26 12:48:19 | 显示全部楼层
fcode 发表于 2016-8-26 11:15
楼主可以看看周振红的书《Intel Visual Fortran 应用程序开发》,上面有专门的多线程的章节。
(虽然我很不 ...

好的 我下来看看,谢谢

66

帖子

16

主题

0

精华

专家

F 币
452 元
贡献
271 点
 楼主| 发表于 2016-8-26 15:01:56 | 显示全部楼层
fcode 发表于 2016-8-26 11:15
楼主可以看看周振红的书《Intel Visual Fortran 应用程序开发》,上面有专门的多线程的章节。
(虽然我很不 ...

按照你的提示 在周振红的书《Intel Visual Fortran 应用程序开发》书里找到了解决办法,果然一点也不卡了 谢谢
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 05:49

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表