我的程序似乎是泄漏文件句柄.我怎样才能找到哪里?
我的程序在几个不同的地方使用文件句柄 - 从子进程输出,调用ctypesAPI(ImageMagick)打开文件,然后复制它们.
它崩溃了shutil.copyfile,但我很确定这不是泄漏的地方.
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 874, in main
magpy.run_all()
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 656, in run_all
[operation.operate() for operation in operations]
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 417, in operate
output_file = self.place_image(output_file)
File "C:\Python25\Lib\site-packages\magpy\magpy.py", line 336, in place_image
shutil.copyfile(str(input_file), str(self.full_filename))
File "C:\Python25\Lib\shutil.py", line 47, in copyfile
fdst = open(dst, 'wb')
IOError: [Errno 24] Too many open files: 'C:\\Documents and Settings\\stuart.axon\\Desktop\\calzone\\output\\wwtbam4\\Nokia_NCD\\nl\\icon_42x42_V000.png'
Press any key to continue …Run Code Online (Sandbox Code Playgroud) 我经常听说过"手柄",究竟是什么?
编辑:例如我听说过:windows处理事件处理文件句柄
等等.那些东西是一样的吗?或者他们是一些抽象的术语?
您可以使用Process Explorer程序查看运行应用程序的句柄数.有没有办法用Delphi代码来获取这个数字?我有兴趣跟踪应用程序本身的编号; 不要像Process Explorer那样找到其他应用程序使用的句柄数.
我的目的是让应用程序跟踪/检测可能的资源泄漏.
我在WPF应用程序中遇到自定义游标的问题.我使用以下代码来创建Cursor对象:
[DllImport("user32.dll")]
private static extern IntPtr CreateIconIndirect(ref IconInfo icon);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
private static Cursor CreateCursor(string cursorName, System.Drawing.Bitmap bmp,
int xHotspot, int yHotspot, out SafeFileHandle handle)
{
IconInfo tmp = new IconInfo();
GetIconInfo(bmp.GetHicon(), ref tmp);
tmp.xHotspot = xHotspot;
tmp.yHotspot = yHotspot;
tmp.fIcon = false;
IntPtr ptr = CreateIconIndirect(ref tmp);
handle = new SafeFileHandle(ptr, true);
if (handle.IsClosed)
{
return null;
}
Cursor cur = CursorInteropHelper.Create(handle);
return cur;
}
Run Code Online (Sandbox Code Playgroud)
当我关闭我的应用程序并且GC开始拾取垃圾时,它会引发异常:
System.Runtime.InteropServices.SEHException …Run Code Online (Sandbox Code Playgroud) 如何在Mac OS X上列出属于特定进程的POSIX命名信号量?
我知道ipcs -s命令,但它似乎列出了System V信号量,我猜这与信号量不同,因为我不认识我自己命名的信号量.
我使用sem_open/ sem_close/ sem_wait函数.
有没有办法列出属于特定进程的"句柄",比如Windows平台上的Process Explorer?
让我们定义任何函数句柄foo:
foo = @(x) x*2
Run Code Online (Sandbox Code Playgroud)
我试图写一个通用函数defFun生成的Ñ个职大功能foo,即ñ的反复调用foo,它可以存储在另一个手柄功能的方式boo,就像这样:
boo = defFun(foo,n)
Run Code Online (Sandbox Code Playgroud)
例如,
foo = @(x) x^2;
boo = defFun(foo,3);
Run Code Online (Sandbox Code Playgroud)
boo(3)将给予6561 [== foo(foo(foo(3)))]和boo(2)将给予256 [== foo(foo(foo(2)))].
我尝试使用此代码编写,defFun但这些句柄处理起来很棘手.有任何想法吗?
function boo = defFun(foo,n)
h = foo;
for i=2:n
h = h(h);
end
boo = h
end
Run Code Online (Sandbox Code Playgroud) 如果ShellExecuteEx返回false,是否应该关闭句柄?:
function EditAndWait(const AFileName : string) : boolean;
var
Info: TShellExecuteInfo;
begin
FillChar(Info, SizeOf(Info), 0);
Info.cbSize := SizeOf(Info);
Info.lpVerb := 'edit';
Info.lpFile := PAnsiChar(AFileName);
Info.nShow := SW_SHOW;
Info.fMask := SEE_MASK_NOCLOSEPROCESS;
Result := ShellExecuteEx(@Info);
if(Result) then
begin
WaitForSingleObject(Info.hProcess, Infinite);
CloseHandle(Info.hProcess);
end else
begin
//should I close the process handle?
end;
end;
Run Code Online (Sandbox Code Playgroud)
更一般地说,我如何检查手柄是否应该关闭?
我知道同样的问题在这里,已经有人问过,并且有答案,但我对这个答案有疑问.
我的要求是,我想确定用户是否处于非活动状态5分钟,然后用户从应用程序中自动注销并上传登录并注销服务器上的日志.
我已经尝试了上面链接中的所有答案,但该答案适用于单个活动,但我想跟踪它以进行多项活动.
为此,我创建了抽象类
public abstract class SessionTimeOutActivity extends BaseActivity {
public static final long DISCONNECT_TIMEOUT = 1000 * 60; // 5 min = 5 * 60 * 1000 ms
private static Handler disconnectHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.d("SessionTimeOutActivity", "disconnectHandler");
return false;
}
});
private Runnable disconnectCallback = new Runnable() {
@Override
public void run() {
// Perform any required operation on disconnect
Log.d("SessionTimeOutActivity", "disconnectCallback");
Toast.makeText(getApplicationContext(), "Session time out", Toast.LENGTH_LONG).show(); …Run Code Online (Sandbox Code Playgroud) 我想做的事? - 基本上我想在特定的时间在特定的X,Y坐标上实用地进行人体触摸 - 运行一个服务,它将通过某个接口(TCP/UDP)接收X,Y坐标 - 使用这些坐标激活dispatchTouchEvent()并获取实际人类手指点击给出的结果 - 我的意思是焦点活动可能是Android主屏幕或任何打开的活动或任何事情 - 片刻服务调用dispatchTouchEvent(),它应该执行点击. - 例如,如果打开App是计算器,并且dispatchTouchEvent()的X,Y坐标指向数字5,则应按5键
我现在做了什么? - 我已经启动了一个接收X,Y坐标的服务 - 在某个触发器上,它调用dispatchTouchEvent(),但它不起作用.它不会点击屏幕上的任何内容. - 它捕捉人类手指所做的每一次触摸事件.
问题是什么? - 如何将dispatchTouchEvent()发布到任何底层活动
示例代码: 我在这里附上示例代码.我刚刚将它简化为测试目的.首先,我们需要点击屏幕中的任意位置.它的X,Y坐标将被保存,一段时间后,将使用相同的坐标调用dispatchTouchEvent().
MainActivity.java
package com.test.overlay;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Intent intent = new Intent(this, Overlay.class);
Intent intent = new Intent(this, PlayerServiceTest.class);
startService(intent);
finish();
}
}
Run Code Online (Sandbox Code Playgroud)
Overlay.java
package com.test.overlay;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PixelFormat; …Run Code Online (Sandbox Code Playgroud)