找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: mdyblog

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

   火... [复制链接]
发表于 2013-4-13 12:03:46 | 显示全部楼层
THREAD 的几个开关 &*+$ 除了+很好理解其他3个一直都没大弄明白区别,补充说明里的例子也没大看懂。

SET &A=1

这之后的 THREAD LOAD 和 THREAD CALL 是如何对待 A 的?
我一直以为 THREAD* LOAD 或者 CALL 和直接的 LOAD 和 CALL 没有区别。


前面的问题好像是因为主线中一个 THREAD* LOAD 的配置文件中的一句 SET &UDHDW 造成的,不知道是新建了一个线程私有的 UDHDW 还是清空了主线程的,然后这个子线程再次 THREAD* LOAD 一个配置文件,之后子线程和孙子线程里取 UDHDW 就都是空值了。

应该就是这个地方出的问题,我再加一些代码仔细检查一下。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 12:18:33 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 12:22 编辑
2010qaqz111 发表于 2013-4-13 11:39
SET &UDHDW
这样的写法如果是在新线程中执行是产生一个线程私有的变量覆盖主线同名吗?线程用 THREAD* 启动 ...


对自线程了来说, 会屏蔽的。不是覆盖。 是新建一个线程私有的UDHDW。 两个变量都在,各是各。
但只能访问子线程的。 由于同名,父线程的那个同名变量子线程访问不了。

但父线程 访问的还是父线程的那个变量。 压根访问不了子线程的变量。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 12:24:45 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 12:03
THREAD 的几个开关 &*+$ 除了+很好理解其他3个一直都没大弄明白区别,补充说明里的例子也没大看懂。

SET ...

》前面的问题好像是因为主线中一个 THREAD* LOAD 的配置文件中的一句 SET &UDHDW 造成的,不知道是新建了一个线程私有的 UDHDW 还是清空了主线程的,然后这个子线程再次 THREAD* LOAD 一个配置文件,之后子线程和孙子线程里取 UDHDW 就都是空值了。
是 新建了一个线程私有的 UDHDW,还是空的。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 12:36:45 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 12:03
THREAD 的几个开关 &*+$ 除了+很好理解其他3个一直都没大弄明白区别,补充说明里的例子也没大看懂。

SET ...

SET &A=1
这之后的 THREAD LOAD 和 THREAD CALL 是如何对待 A 的?
我一直以为 THREAD* LOAD 或者 CALL 和直接的 LOAD 和 CALL 没有区别。
1: 这之后的 THREAD LOAD 和 THREAD CALL 是如何对待 A 的?

子线程会建立一个自己私有的 拷贝A。 和原来的A各是各。
只有::的全局变量才是共享的。

LOAD  和CALL , 在此问题上一样。

SET &A=1 //拷贝
THREAD     。。。。。。


2: THREAD* LOAD 和 THREAD* CALL 等 THREAD*

就分情况。

1) 如果此时在一个临时执行栈(普通函数,块), 和不带*一样, 会建立拷贝。


     SET &A=1    //拷贝
    THREAD*   。。。。。。


_SUB ABC
     SET &A=1 //拷贝
    THREAD* 。。。。。。
_END

2) 如果此时在一个持久执行栈(窗口_SUB本级, 持久函数), 不会建立拷贝。 直接共享。
如:
_SUB ABC,W100H100   //窗口
      SET &A=1   //共享
     THREAD* 。。。。。。
_END

_SUB ABC, *    //持久函数
     SET &A=1    //共享
     THREAD* 。。。。。。
_END

注意如果外面加一对{},就属于1)了:

_SUB ABC,W100H100 //窗口

      SET &A=1   //拷贝
     THREAD* 。。。。。。
  }
_END
回复

使用道具 举报

发表于 2013-4-13 12:37:29 | 显示全部楼层
改成 SET &UDHDW=%&UDHDW% 后查日志看来是正常了,应该就是在子线中的 SET &UDHDW 新建了一个私有变量导致后面读到空变量的。

前面 GETF 读到 0 的原因也清楚了,也是因为这个写法出的问题。

回复

使用道具 举报

 楼主| 发表于 2013-4-13 12:40:14 | 显示全部楼层
2010qaqz111 发表于 2013-4-13 11:39
SET &UDHDW
这样的写法如果是在新线程中执行是产生一个线程私有的变量覆盖主线同名吗?线程用 THREAD* 启动 ...


》》SET &UDHDW
》》这样的写法如果是在新线程中执行是产生一个线程私有的变量覆盖主线同名吗?线程用 THREAD* 启动的。
是产生一个线程私有的变量, 屏蔽 主线同名变量。 都在,各是各。
子线程只能访问这个私有的 UDHDW; 访问不了 主线的UDHDW。
回复

使用道具 举报

发表于 2013-4-13 12:57:52 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 12:59 编辑

LOGS **2 貌似不能放在 {} 里?
  1. IFEX %Desktop%\,
  2. {   LOGS **2 *%Desktop%\z.log
  3. }

  4. SET &A=1
  5. CALC #&A=1+%&A%
复制代码
这样写输出的 LOG 还是只有执行后,命令用 [] 包围的。

日志是否输出是用存放日志的文件夹是否存在作为条件控制的,所以这样写。
{} 里还有其他命令,是设置日志路径变量的,给后面的 EXEC --logs 用。
回复

使用道具 举报

发表于 2013-4-13 13:06:51 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-13 13:11 编辑
mdyblog 发表于 2013-4-13 12:36
SET &A=1
这之后的 THREAD LOAD 和 THREAD CALL 是如何对待 A 的?
我一直以为 THREAD* LOAD 或者 CALL ...


_SUB F,* 定义的持久函数是个什么概念?是说这个函数内用 SET& 定义的变量在 _END 后不会销毁,下次进入该函数其值仍然在,就相当于 c 函数里用 static 定义的变量?


THREAD* 与不加 * 的不同之处在于从窗口的_SUB和,*的_SUB里启动子线程的时候,子线程能否共享上级的变量,是这样吗?


那 & 和 $ 又是什么用处?
回复

使用道具 举报

 楼主| 发表于 2013-4-13 13:49:38 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 14:19 编辑
2010qaqz111 发表于 2013-4-13 12:57
LOGS **2 貌似不能放在 {} 里?这样写输出的 LOG 还是只有执行后,命令用 [] 包围的。

日志是否输出是用 ...


**2
**RAW
**P
这些开关 都是局部开关, 这样各个线程(函数,块)可以有不同的状态设置。
能够继承。
可以在{}后面或前面
单独加一个
LOGS  **2
  
回复

使用道具 举报

发表于 2013-4-13 13:57:44 | 显示全部楼层
mdyblog 发表于 2013-4-13 13:49
**2
**RAW
**P

明白了,我把代码改一下,把这个开关放到顶级去。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 14:14:12 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 14:38 编辑
2010qaqz111 发表于 2013-4-13 13:06
_SUB F,* 定义的持久函数是个什么概念?是说这个函数内用 SET& 定义的变量在 _END 后不会销毁,下次进入 ...


》_SUB F,* 定义的持久函数是个什么概念?是说这个函数内用 SET& 定义的变量在 _END 后不会销毁,下次进入该函数其值仍然在,就相当于 c 函数里用 static 定义的变量?
A: 象窗口一样有持久栈,THREAD* 时可以共享其变量。
_SUB   ABC,*
        SET &A=1
        THREAD*  .....
_END
这样 A就是共享变量。而不是拷贝。
同时 ABC 必须保证 子线程 运行期间,A 和含A的栈时可用的,不能销毁了。
这样,运行到 _END处, 标记为已终止, 但会等待子线程结束才真正退出并销毁堆栈。


_SUB   ABC
        SET &A=1
        THREAD*  .....
_END
则不同, 往上找 持久栈,从此处堆栈树分裂,之后的变量为临时变量,全部建一份拷贝。持久栈和以前的变量则共享。
这里 子线程会建立 A的拷贝。
父线程ABC 运行到_END , A 销毁, ABC的堆栈销毁, ABC完全退出。
  
2:
》》》THREAD* 与不加 * 的不同之处在于从窗口的_SUB和,*的_SUB里启动子线程的时候,子线程能否共享上级的变量,是这样吗?
是的。 THREAD*  则共享可共享的变量;还保持窗口的父子关系(链),这样可以象被CALL一样直接访问父窗口及其控件。

3>THREAD
*    有*则共享可共享的变量;还保持窗口的父子关系(链)。否则不共享(除::全局变量),掐断窗口的父子关系链。
&    &表示强制变为PE变量,能最简单变多线程。就是 给子线程 强加了 ENVI^  ForceLocal=1
$    提前解释THREAD 后面的命令, 变量直接变成对应的值。可避免一些延迟解释带来的问题。如%1  %循环变量%
      A=1   //
      LOOP #%&A%<3,
      {         
          THREAD*$ MESS    %A%
          // 解释为THREAD  MESS 1 ,等, 这样不受后面 A=%&A%+1 影响。
          CALC #&A=%&A%+1
      }
+    +为弃儿线程。程序到结尾是不等待该线程退出。
回复

使用道具 举报

发表于 2013-4-13 14:35:34 | 显示全部楼层
&    &表示强制变为PE变量,能最简单变多线程。

这个是把什么强制变为PE变量?是指主线程里用 ENVI A=定义的变量到了子线程里就变成了一份 ENVI &&A= 定义的 A 的拷贝?
能举个例子吗?

$    提前解释THREAD 后面的命令, 变量直接变成对应的值。可避免一些延迟解释带来的问题。如%1  %循环变量%
       A=1   //
       LOOP #%&A%<3,
       {         
           THREAD*$ MESS    %A%
           // 解释为THREAD  MESS 1 ,等, 这样不受后面 A=%&A%+1 影响。
           CALC #&A=%&A%+1
       }

这个明白了,是在启动新线程之前,将 THREAD 命令后面那一行里出现的 %&变量名% 引用的变量解释完成之后再启动子线程。
回复

使用道具 举报

 楼主| 发表于 2013-4-13 14:39:39 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-13 14:49 编辑
2010qaqz111 发表于 2013-4-13 14:35
这个是把什么强制变为PE变量?是指主线程里用 ENVI A=定义的变量到了子线程里就变成了一份 ENVI &&A= 定义 ...


1: 就是 给子线程 强 加了 ENVI^  ForceLocal=1

原来程序    用环境变量
_SUB MAIN1
    ENVI  A=%1
    ENVI  I=0
    LOOP #%I%<100, TEAM CALC A=%A% +1| CALC  I=%I% +1
    MESS  SUM=%A%  
_END
CALL  MAIN1 100
CALL  MAIN1 200
多线程:
THREAD*&  CALL MAIN1 100
THREAD*&  CALL MAIN1  200
这样两个线程相安无事。 没有环境变量的冲突。

2:对了。
回复

使用道具 举报

发表于 2013-4-13 14:52:16 | 显示全部楼层
本帖最后由 2011hwo1 于 2013-4-13 14:54 编辑

定时提醒.7z (2.34 KB, 下载次数: 9)

  现在我重新写的定时提醒代码,优化了算法和界面,性能比原来的定时器要好点.
回复

使用道具 举报

 楼主| 发表于 2013-4-13 15:01:46 | 显示全部楼层
2011hwo1 发表于 2013-4-13 14:52
现在我重新写的定时提醒代码,优化了算法和界面,性能比原来的定时器要好点.

好的。
回复

使用道具 举报

发表于 2013-4-13 16:31:01 | 显示全部楼层
mdyblog 发表于 2013-4-13 14:39
1: 就是 给子线程 强 加了 ENVI^  ForceLocal=1

原来程序    用环境变量

明白了,谢谢
回复

使用道具 举报

发表于 2013-4-14 15:36:35 | 显示全部楼层
Win8PE下,用2012.1.70.3版pecmd show -1:-1不能显示ultraiso U+高端隐藏分区?

文件: D:\My Documents\PE\PECMD.EXE
大小: 438784 字节
文件版本: 2012.1.70.3 X86
MD5: 48331D5BD06BFCD883D8EDAEB215760F
SHA1: 4C263D32EC57627E46D497371CCA3FFE404B9B95
CRC32: 833FC50D
回复

使用道具 举报

 楼主| 发表于 2013-4-14 16:53:36 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-14 16:57 编辑
chiannet 发表于 2013-4-14 15:36
Win8PE下,用2012.1.70.3版pecmd show -1:-1不能显示ultraiso U+高端隐藏分区?

文件: D:\My Documents\ ...


我在  WIN7-X64 正常。
Snap2.gif

SHOW -1:-1 后
无标题.png
是不是你要刷新一下窗口。 或关闭我的电脑(该叫计算机),再打开。

//PECMD201201.77.0.0

//ultraiso U+  后我U盘上的东西都没了。 也太。。。。
回复

使用道具 举报

发表于 2013-4-14 17:02:50 | 显示全部楼层
mdyblog 发表于 2013-4-14 16:53
我在  WIN7-X64 正常。

我在windows XP下测试5811楼那个pecmd.exe 的show命令完全正常。
回复

使用道具 举报

发表于 2013-4-14 17:26:25 | 显示全部楼层
到实机win8PE下测试正常。看来是虚拟机有些问题。
回复

使用道具 举报

 楼主| 发表于 2013-4-14 17:54:42 | 显示全部楼层
chiannet 发表于 2013-4-14 17:26
到实机win8PE下测试正常。看来是虚拟机有些问题。

对啊。
USM_8PE_x64_UEFI_v1.0.0.3.iso
下 正常。
8pe_show-U .png
回复

使用道具 举报

发表于 2013-4-14 21:22:31 | 显示全部楼层
本帖最后由 2012yws@ 于 2013-4-14 21:30 编辑
mdyblog 发表于 2013-4-14 17:54
对啊。
USM_8PE_x64_UEFI_v1.0.0.3.iso
下 正常。


楼主,恳请你认真快速修正TEMP命令造成混乱的问题,如图:
TEMP命令混乱.gif

另请在TEMP Setting 设置参数中添加静默方式,现在只有弹出对话框设置的方式;

*建议在这个命令的设置上强制加上默认“TEMP”目录的设置,就是无论设置到什么路径,在没有指定目录的情况下,强制使用默认值,如:x:\temp,不然会产生很痛苦的结果。
回复

使用道具 举报

发表于 2013-4-14 21:40:09 | 显示全部楼层
这段代码为何执行不了?哪里写错了?
  1. LOGS **2 *%Desktop%\z.log
  2. FZ3 1 2 3

  3. _SUB FZ1
  4.     SET &A=%*
  5.     MESS %&A%
  6. _END

  7. _SUB FZ2
  8.     SET &A=%*
  9.     FZ1 %&A%
  10. _SUB

  11. _SUB FZ3
  12.     SET &A=%*
  13.     FZ2 %&A%
  14. _END
复制代码
这是直接在pecmd窗口执行的 log
  1. 1256        3678146966152.216        {ENTER:X:\WINDOWS\system32\*map:2452:366}
  2. 1256        3678147037995.123        [LOGS **2 *X:\Users\Default\Desktop\z.log]        <0>        :操作成功完成。
  3. 1256        3678147170928.938        {FZ3 1 2 3}
  4. 1256        3678148331656.184        [FZ3 1 2 3]        <2>        :系统找不到指定的文件。
  5. 1256        3678148649328.904        [LEAVE:*map:2452:366]
  6. 1256        3678148876587.080        [LEAVE:]
复制代码
这是在文件加载执行的log
  1. 1996        3771202630721.102        {ENTER:X:\Users\Default\Desktop\1.wcs}
  2. 1996        3771202704030.191        [LOGS **2 *X:\Users\Default\Desktop\z.log]        <0>        :操作成功完成。
  3. 1996        3771202872641.096        {FZ3 1 2 3}
  4. 1996        3771203982540.707        [FZ3 1 2 3]        <2>        :系统找不到指定的文件。
  5. 1996        3771204335890.517        [LEAVE:X:\Users\Default\Desktop\1.wcs]
  6. 1996        3771204606156.692        [LEAVE:]
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-4-14 22:24:01 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-14 23:33 编辑
2012yws@ 发表于 2013-4-14 21:22
楼主,恳请你认真快速修正TEMP命令造成混乱的问题,如图:


>>楼主,恳请你认真快速修正TEMP命令造成混乱的问题
1. 不知混乱在哪里?
WINDOWS 就这样。

2. TEMP Setting %PETEMP%
命令用错了。
应该 为【TEMP Setting】

3。 》》*建议在这个命令的设置上强制加上默认“TEMP”目录的设置,就是无论设置到什么路径,在没有指定目录的情况下,强制使用默认值
可以写注册表实现。
_SUB  SETTEMP     
  REGI $HKCR\Environment\TEMP=%~1  
  REGI $HKCR\Environment\TMP=%~1
  ENVI TEMP=%~1
  ENVI TMP=%~1
_END

_SUB  SETTEMP   //标准点,
  ENVI #TEMP=%~1
  ENVI #TMP=%~1
_END


_SUB  SETTEMP   //复杂点,兼顾到
  REGI $HKCR\Environment\TEMP=%~1  
   REGI $HKCR\Environment\TMP=%~1
   ENVI TEMP=%~1
   ENVI TMP=%~1
  THREAD$    TEAM ENVI
_END

SETTEMP   D:\TEMP

回复

使用道具 举报

 楼主| 发表于 2013-4-14 22:29:58 | 显示全部楼层
2010qaqz111 发表于 2013-4-14 21:40
这段代码为何执行不了?哪里写错了?这是直接在pecmd窗口执行的 log这是在文件加载执行的log

第12行错了 不是_SUB
而是_END
回复

使用道具 举报

发表于 2013-4-14 22:32:58 | 显示全部楼层
本帖最后由 2010qaqz111 于 2013-4-14 22:34 编辑
mdyblog 发表于 2013-4-14 22:29
第12行错了 不是_SUB
而是_END


我晕死。。。复制粘贴没看清,今天昏头了算了睡觉去明天再搞了@@
回复

使用道具 举报

 楼主| 发表于 2013-4-14 22:41:51 | 显示全部楼层
本帖最后由 mdyblog 于 2013-4-15 14:13 编辑
2010qaqz111 发表于 2013-4-14 22:32
我晕死。。。复制粘贴没看清,今天昏头了算了睡觉去明天再搞了@@

用 PECMDEDIT吧。(包内有,EDITPLUS  PECMDEDIT, UEDIT 均已改)
Snap2.gif
回复

使用道具 举报

发表于 2013-4-14 23:02:59 | 显示全部楼层
有点明白,TEMP是否系统分了系统变量和用户变量?
而这两个变量不在一个层级?而TEMP设置的是用户变量?
如果要设置用户变量和系统变量都统一,该如何做?
回复

使用道具 举报

 楼主| 发表于 2013-4-14 23:22:46 | 显示全部楼层
2012yws@ 发表于 2013-4-14 23:02
有点明白,TEMP是否系统分了系统变量和用户变量?
而这两个变量不在一个层级?而TEMP设置的是用户变量?
...



_SUB  SETTEMPALL   //复杂点,兼顾到
    REGI $HKCR\Environment\TEMP=%~1  
    REGI $HKCR\Environment\TMP=%~1
    REGI $HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\TEMP=%~1
    REGI $HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\TMP=%~1
    ENVI TEMP=%~1
    ENVI TMP=%~1
    THREAD$    TEAM ENVI
_END

SETTEMPALL  D:\TEMP
回复

使用道具 举报

发表于 2013-4-14 23:35:37 | 显示全部楼层
mdyblog 发表于 2013-4-14 23:22
_SUB  SETTEMPALL   //复杂点,兼顾到
    REGI $HKCR\Environment\TEMP=%~1  
    REGI $HKCR\En ...

谢谢了,不过想问“SETTEMPALL  D:\TEMP

的写法工作原理是什么?以前好像是不支持这样的命令写法的.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-9-11 02:31

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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