好的,所以我知道我应该使用ImageMagick DLL ......我正在学习,测试并努力做到这一点.但与此同时,我正在使用通过一个进程调用Imagemagick的convert.exe的低效方法.
当我测试时,它可以正常处理数百张图像.但后来我将我的WindowsForms程序移动到更快的机器上,并且每次都在同一点崩溃.
这是一个两步过程调用.第一次循环遍历所有文件并生成PNG.然后我循环遍历所有PNG并将其与背景合成并输出JPG.但是每次正好在22个图像上出现错误"System.OutOfMemoryException:Out of memory".有什么东西可以填满,我需要杀死什么?
foreach (string file in files)
{
try
{
string captureImg = Path.GetFileName(file);
string maskImg = file.Replace("X.JPG", "Y.JPG");
string OutputImage = string.Format("{0}.png", Path.GetFileNameWithoutExtension(captureImg));
string output = Path.Combine(destFolder, OutputImage);
//MessageBox.Show(output);
progressBarImage.Value = progressBarImage.Value + 1;
lblStatus.Text = string.Format("Image {0} of {1}", progressBarImage.Value, maxFiles);
makePNG(file, maskImg, output);
Application.DoEvents();
}
catch (Exception)
{
}
}
if (chkBG.Checked)
{
//try
//{
string JPGdir = Path.Combine(destFolder, "JPGs");
string[] PNGfiles = Directory.GetFiles(destFolder, "*C.PNG");
lblProgress.Text = "Generating JPGs with …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个在默认图像查看器中打开图像的简短方法,并在time几毫秒后关闭它.
现在它看起来像这样:
public static async void OpenImage(string path, int time)
{
var process = new Process();
process.StartInfo.FileName = path;
process.Start();
await Task.Delay(time);
process.Kill()
process.Close()
}
Run Code Online (Sandbox Code Playgroud)
我可以看到图像,但随后process.Kill()抛出InvalidOperationException"没有进程与此对象相关联".
我错过了什么或者还有其他办法吗?
更新:
现在也测试了这个:
public static async void OpenImage(string path, int time)
{
var process = Process.Start(path)
await Task.Delay(time);
process.Kill()
process.Close()
}
Run Code Online (Sandbox Code Playgroud)
但后来Process.Start()回归null.所以也许我必须.exe直接打电话给faljbour评论?
我正在研究一种检查AIX上进程内存使用情况的方法,并找到了这个页面,列出了这个命令:
# svmon -Pt15 | perl -e 'while(<>){print if($.==2||$&&&!$s++);$.=0 if(/^-+$/)}'
Run Code Online (Sandbox Code Playgroud)
它适用于我的目的,但我想了解Perl单线器部件的工作原理.
我知道它正在解析svmon命令的输出.我已经理解了$.==2输出第二行的部分.该部分$.=0重置行号,以便它可以对列出的每个进程执行相同的处理svmon.
但是我无法理解这部分内容||$&&&!$s++.有OR.$&是匹配的部分(什么?)和&&是AND运算符,但我不确定我是否正确分解它.
svmon返回(没有任何重定向)每个进程的类似行块.第一行类似于:
# svmon -Pt15 | head -n 20
-------------------------------------------------------------------------------
Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd 16MB
12058652 java 579432 8261 397386 824106 Y Y N
PageSize Inuse Pin Pgsp Virtual
s 4 KB 67560 309 1610 40138
m 64 KB 31992 497 24736 48998
Vsid Esid Type Description PSize Inuse …Run Code Online (Sandbox Code Playgroud) 我有一个ac#程序,它将使用Process.start()调用另一个c#程序,我也有源代码.
我如何从第二个程序返回一个字符串,它可以被调用者程序读取.
谢谢
如果我像这样运行Bash脚本:
./script.sh 2>&1
Run Code Online (Sandbox Code Playgroud)
stderr将被重定向到stdout.
如果脚本在内部调用某个工具(例如ls)或生成一个新进程,这些子进程是否stderr也将它们重定向到stdout?
我已经对进程之间的上下文切换问题感到困惑,给定了某个时间片的循环调度程序(这是unix/windows在基本意义上都使用的).
因此,假设我们在一台核心机器上运行了200个进程.如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求).话虽如此,我在图片中遗漏了什么?
此外,java和其他语言允许将正在运行的线程休眠例如100ms.我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?
我有一个单一的应用程序,单个进程有5个线程.每个线程完成某些特定任务.考虑使用docker将此应用程序移至微服务.如果我查看架构,每个工作线程将成为一个docker进程.因此,在我的案例中,Monolithic vs Microservices在某些方面变得更像Thread and Process讨论.
拥有单片的最初想法是拥有性能线程并共享相同的内存.现在有了微服务拱,我被推到了一个可能不适合从性能角度来看的流程模型.
我有点坚持如何处理这个问题.
是否有可能以某种方式从"外部"通知正在运行的进程?
我有一个理论上永远存在的C#程序.我想通知它手动触发一些动作.如果在Windows和Linux(单声道)上可以使用此解决方案,那将是最好的.
编辑:
Task该类来保持活跃状态我一直在阅读有关如何检查我的机器有多少CPU或内核(MacBook OS X,Sierra,v.10.12,2GHz Intel Core i7),但有许多不同的答案,例如:
我需要的是确保我的C++程序只运行一个CPU(如果可能的话,只运行一个核心,即没有调度,即我的程序应该有一个专用的核心来运行=>我'我不确定我的Mac OS X架构是如何组织的.
我不确定这是否应该在实现,编译或执行级别完成.我见过人们谈论tasksetUbuntu,但我不确定这对我来说是否是正确的工具(可能它甚至不适用于Mac OS X).
注意:如果您觉得应该在另一个Stack Exchange网站上询问此问题,请告诉我,我会将其移至那里.实际上我希望我的解决方案是跨平台的,所以也许这不是问这个问题的最佳地方.
我正在尝试通过互斥锁建立进程间通信.我有一个过程可以做到这一点:
HANDLE hMutex = CreateMutex(NULL, TRUE, "amutex_name");
if (!hMutex) {
puts("Error creating mutex. Aborting.");
return;
}
for (int i = 0; i < 500; ++i) {
if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED) {
puts("Error waiting for mutex. Aborting.");
return;
}
if (!ReleaseMutex(hMutex)) {
puts("Error releasing mutex. Aborting.");
return;
}
puts("MUTEX RELEASED");
Sleep(2000);
}
CloseHandle(hMutex);
Run Code Online (Sandbox Code Playgroud)
第二个程序(不同的过程)执行此操作:
HANDLE hMutex = CreateMutex(NULL, FALSE, "amutex_name");
if (!hMutex) {
puts("Error creating mutex. Aborting.");
return;
}
while (1) {
if (WaitForSingleObject(hMutex, INFINITE) == WAIT_FAILED)
continue;
if (!ReleaseMutex(hMutex)) …Run Code Online (Sandbox Code Playgroud)