如何使用AtomiccmpExchange加倍?

时间:2017-10-13 07:47:02

标签: delphi firemonkey

我有一个双重值,我需要在backgroundThread中访问。我想使用像> cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --p rogress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js 'cross-env' is not recognized as an internal or external command, operable program or batch file. npm ERR! Windows_NT 6.1.7601 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\ node_modules\\npm\\bin\\npm-cli.js" "run" "watch" npm ERR! node v6.11.4 npm ERR! npm v3.10.10 npm ERR! code ELIFECYCLE npm ERR! @ watch: `cross-env NODE_ENV=development node_modules/webpack/bin/webpa ck.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/ webpack.config.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the @ watch script 'cross-env NODE_ENV=development node_modul es/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_module s/laravel-mix/setup/webpack.config.js'. npm ERR! Make sure you have the latest version of node.js and npm installed. npm ERR! If you do, this is most likely a problem with the package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpac k.config.js npm ERR! You can get information on how to open an issue for this project with: npm ERR! npm bugs npm ERR! Or if that isn't available, you can get their info via: npm ERR! npm owner ls npm ERR! There is likely additional logging output above. 这样的一些思考但是缝不能用于双重。他们的任何其他等价物,我可以使用双?我想避免使用AtomiccmpExchange / Tmonitor.enter因为我需要尽可能快的东西。我在android / ios下,所以在firemonkey下

2 个答案:

答案 0 :(得分:2)

您可以将double值转换为UInt64值:

PUInt64(@dOld)^ := AtomicCmpExchange(PUInt64(@d)^,PUInt64(@dNew)^,PUInt64(@dCom‌​p)^); 

请注意,您需要根据平台规范正确对齐变量。

正如@David所指出的,比较double值与比较UInt64值并不相同。有些特定的双重值会表现得与众不同:

  • NaN通常(在IEEE-754中指定)通过比较值来检测。

    IsNaN := d <> d; 
    

    脚注:在比较NaN时触发Delphi默认异常处理程序,但其他编译器可能表现不同。在Delphi中,可以使用IsNaN()函数。

  • 同样,对于special meaning,零值可以是正数也可以是负数。将double 0与double -0进行比较将返回true,但比较内存占用将返回false。

答案 1 :(得分:0)

也许使用 System.SyncObjs.TInterlocked 类方法会更好吗?