我有一个新手(隔壁的少年)写了一些PHP代码来跟踪我的网站上的一些用法.我不熟悉php,所以我要问一些关于并发文件访问的问题.
我的原生应用程序(在Windows上)偶尔通过点击包含我的PHP脚本的URL将一些数据记录到我的网站.本机应用程序不检查返回的数据.
$fh = fopen($updateFile, 'a') or die("can't open file");
fwrite($fh, $ip);
fwrite($fh, ', ');
fwrite($fh, $date);
fwrite($fh, ', ');
fwrite($fh, implode(', ', $_GET));
fwrite($fh, "\r\n");
fclose($fh);
Run Code Online (Sandbox Code Playgroud)
这是一个流量较低的站点,数据并不重要.但是如果两个用户发生冲突并且脚本的两个实例都试图在文件中添加一行,会发生什么?在php中是否有任何隐式文件锁定?
上面的代码至少是安全的,不会锁定并且永远不会将控制权返回给我的用户吗?该文件可以被破坏吗?如果我上面的脚本每月删除文件,如果脚本的另一个实例正在写入文件,会发生什么?
为什么此代码在结果上获得访问错误:= D2010中的缓冲行,但不是D7?
我猜,有些东西涉及UniCode,但编译器不会产生任何警告.
有关优雅解决方案的任何建议吗?
编辑:哎呀:GetTempPath调用正在摧毁堆栈,因为GetTempPath行之后Extension是空的,但之前没有... Yikes.
function GetTempPathAndFileName( const Extension: string): string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
repeat
GetTempPath(SizeOf(Buffer) - 1, Buffer);
GetTempFileName(Buffer, '~', 0, Buffer);
Result := Buffer; // <--- crashes on this line,
Result := ChangeFileExt(Result, Extension);
until not FileExists(Result);
end; { GetTempPathAndFileName }
Run Code Online (Sandbox Code Playgroud) 我有一个(光谱分布)的数据集波长(x轴)和强度(y轴,以任意单位,其可具有不同的范围...)
我想将此数字数据转换为图形视图,如下图所示.
但是,我从来没有用帆布的,TImages,位图,或任何方式,我会得到这个屏幕做过任何德尔福(2010年).
(显然,如果我可以把数据转换成图像像素的一行,我后来干脆作为根据需要多次为我所需的图像高度复制该行.)
任何人都可以指出我正确的方向或提供遍历x,y值的样本代码,创建彩色图像?我希望我的解决方案能让我(或用户)调整水平(对比度,亮度).
提前致谢.

相关SO帖子:将任何正整数转换为RGB值的算法
在TDbGrid.OnColumnMoved事件处理程序中,我调整了一些列标题颜色.
我还使用网格的OnTitleClicked事件来弹出(排序列)菜单.
不幸的是,在用户拖动列并OnColumnMoved完成后,VCL调用OnTitleClicked.这意味着在列拖动后会出现我的排序顺序弹出窗口.
有没有办法OnColumnMoved可以清除鼠标事件队列,以免OnTitleClicked被调用?
这个线程有这个代码,但我没有Msg在OnTitleClicked.
while PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST,
PM_REMOVE or PM_NOYIELD) do;
Run Code Online (Sandbox Code Playgroud)
(如果没有办法做到这一点,那就不大了.我可以设置一个标志,OnColumnMoved以便OnTitleClick忽略下一次调用.)
我们提供使用我们的应用程序安装在本地(Windows)硬盘上的Flash教程视频.我们的应用程序使用ShellExecute打开嵌入它们的html文件(在任何与html文件相关联的浏览器中).
显然,Chrome最新的Flash播放器中存在一个错误,无法播放本地文件(但网络上的文件很好.)
(坦率地说,我很惊讶谷歌没有修复这个错误.对我来说似乎是一个很大的问题......但也许没有多少人从网络以外的地方玩Flash?)
关于Chrome中的about:plugins屏幕有一个解决方法,但我们不能要求我们的用户这样做.以下是对解决方法的讨论:http://techsmith.custhelp.com/app/answers/detail/a_id/3518
我想为我的用户提供打开我们的HTML文件IE的选项. 如果Chrome是他们的默认浏览器,那么我会显示一个复选框,上面写着"如果我们的教程视频无法播放",请选中此复选框以在IE中试用它们.
这个XE2代码(两年前在SO:link上)是否仍然合理?
if pos('CHROME', UpperCase(GetAssociation('C:\Path\File.html')) > 0 then
// Chrome is the default browser
function GetAssociation(const DocFileName: string): string;
var
FileClass: string;
Reg: TRegistry;
begin
Result := '';
Reg := TRegistry.Create(KEY_EXECUTE);
Reg.RootKey := HKEY_CLASSES_ROOT;
FileClass := '';
if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then
begin
FileClass := Reg.ReadString('');
Reg.CloseKey;
end;
if FileClass <> '' then begin
if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then
begin
Result := Reg.ReadString('');
Reg.CloseKey;
end;
end;
Reg.Free;
end;
Run Code Online (Sandbox Code Playgroud) 我使用Delphi XE2和DISQLite v3(它基本上是SQLite3的一个端口).我喜欢所有的sqlite3的,除了在缺乏并发写的,特别是我广泛地依赖于多线程在这个项目:(
我的探查器明确表示我需要对此做些什么,所以我决定使用这种方法:
每当我需要在DB中插入一条记录,而不是做一个INSERT,我write在一个特殊的foler中的SQL查询,即.
WriteToFile_Inline(SPECIAL_FOLDER_PATH + '\' + GUID, FileName + '|' + IntToStr(ID) + '|' + Hash + '|' + FloatToStr(ModifDate) + '|' + ...);
我添加了一个timer(在主应用程序线程中)每分钟触发,解析这些文件,然后使用事务INSERT查询.
最后删除那些临时文件.
结果是我有500%的性能提升.此外,这种技术是ACID,因为我总是可以SPECIAL_FOLDER_PATH在电源故障后扫描并执行我发现的INSERT.
尽管结果很好,但我对使用的方法不太满意(至少可以说是hackish),我一直在想,如果我有一个类似于泛型的快速查找访问,线程安全,ACID列表,这将是更清洁(可能更快?)
所以我的问题是:你对Delphi XE2有什么了解吗?
PS.我相信你们很多人在阅读上面的代码时会感到震惊并且会在这一点上开始侮辱我!请成为我的客人,但如果您了解更好(即更快)的ACID方法,请分享您的想法!
我需要在另一个应用程序关闭文件时生成一个事件.
不幸的是,ReadDirectoryChangesW不报告close事件.我可以(通过TTimer)轮询由ReadDirectoryChangesW报告为修改的任何文件,等待它被关闭(使用CreateFile来检测它).
但是,我更喜欢的是一个完全由事件驱动的解决方案.
有没有办法挂钩系统调用并检测所有文件关闭事件?我只是想知道刚刚关闭的任何文件的路径和名称.
线程读取由Delphi VCL事件设置的变量是否安全?
当用户单击VCL TCheckbox时,主线程将布尔值设置为复选框的Checked状态.
CheckboxState := CheckBox1.Checked;
Run Code Online (Sandbox Code Playgroud)
在任何时候,线程都会读取该变量
if CheckBoxState then ...
Run Code Online (Sandbox Code Playgroud)
如果线程"错过"对布尔值的更改并不重要,因为线程会检查循环中的变量,因为它会执行其他操作.所以它最终会看到状态变化......
这样安全吗?或者我需要特殊代码?围绕变量的读写(分别在线程和主线程中)是否需要充分的关键代码调用?
正如我所说的,如果线程获得"错误"值并不重要,但我一直认为如果一个线程在主线程处于写入过程中尝试读取变量时可能存在低级问题它,反之亦然.
我的问题类似于这个问题:对一个变量的跨线程读取是不重要的.
(也与我之前的问题有关:在Thread中使用EnterCriticalSection来更新VCL标签)
我们想要D7中的一个程序知道它是从我们的某个应用程序通过ShellExecute命令运行,还是由用户直接启动.
有没有可靠的方法让Delphi 7程序确定运行它的程序的名称?
我们当然可以让我们的父程序使用命令行参数或其他标志,但我们更喜欢上述方法.
TIA
我想在不同的文件夹中安装文件,具体取决于用户是选择为所有用户安装还是仅为当前用户安装.
我添加了使用CreateInputOptionPage()来创建一个带有两个单选按钮的选项页面.
但是,我的安装程序现在散落着许多重复的行,比如这两个:
Source: {#ProjectRootFolder}\License.txt; DestDir: {userdocs}\{#MyAppName}; Check: NOT IsAllUsers
Source: {#ProjectRootFolder}\License.txt; DestDir: {commondocs}\{#MyAppName}; Check:IsAllUsers
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式来做上述事情?例如,Pascal代码可以创建一个像#define这样的变量,所以我可以用它代替上面的{userdocs}和{commondocs}吗?
更多详情:
上面的IsAllUsers()函数调用此代码:
function IsAllUsers: Boolean;
begin
#ifdef UPDATE
Result := AllUsersInRegistryIsTRUE;
#else
Result := AllUsersOrCurrentUserPage.Values[1]; // wizard page second radio button
#endif
end;
Run Code Online (Sandbox Code Playgroud)
和:
function AllUsersInRegistryIsTRUE: Boolean; // True if preceding install was to all users' documents
var
AllUsersRegValue: AnsiString;
begin
if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\MyApp', 'AllUsers', AllUsersRegValue) then
Result := (UpperCase(AllUsersRegValue) = 'YES')
else
Result := FALSE;
end;
Run Code Online (Sandbox Code Playgroud) delphi ×8
acid ×1
colors ×1
delphi-2010 ×1
delphi-xe2 ×1
graphics ×1
inno-setup ×1
locking ×1
php ×1
sqlite ×1