Error communicating with PsExec service on ****: パイプの他端にプロセスがありません。
というエラーが出たので、次のフォーラムの記述を参考に対処したメモ
Windows タスクマネージャーから、全ユーザーのプロセスを表示して、PSEXESVC.exe
のプロセスを終了→再接続。
これだけ。
PsExecのコマンドを送りすぎが原因という噂もあるが、良く分からない。
Error communicating with PsExec service on ****: パイプの他端にプロセスがありません。
というエラーが出たので、次のフォーラムの記述を参考に対処したメモ
Windows タスクマネージャーから、全ユーザーのプロセスを表示して、PSEXESVC.exe
のプロセスを終了→再接続。
これだけ。
PsExecのコマンドを送りすぎが原因という噂もあるが、良く分からない。
cv::gpu::countNonZero
をgpu::Stream
で高速化したいという需要があったので、その解決策を書いておく。
opencvの2系のcountNonZeroはstreamを使うことが出来ない。そのため、非同期処理を行い高速化する際のボトルネックになる。cv::gpu::reduceは2次元画像を1次元に射影するための関数でstreamが使えるので、CV_REDUCE_SUM
を使って射影した後、軽量化された1次元画像を非同期ダウンロードし、CPUで積算処理を行えばよい。行または列の合計値が255を超えた場合は完全に一致しないものの、ラフな値で良い場合はこの方法が適切である。
以下はサンプルコードでは、コアの部分だけ記述した。streamやgvec等を使いまわさないと初期化に時間がかかるので注意が必要。
cv::gpu::GpuMat gmat = cv::gpu::GpuMat(cv::Size(1920, 1080), CV_8UC1); cout << cv::gpu::countNonZero(gmat) << endl; //streamが使えない cv::gpu::GpuMat gvec; cv::gpu::Stream stream; cv::gpu::reduce(gmat, gvec, 1, CV_REDUCE_SUM, -1, stream); //行ごとに積算する場合 cv::Mat vec; stream.enqueueDownload(gvec, vec); cout << cv::sum(vec)[0] << endl;
C#で以下のリソースの監視をしたいという需要があったのでサンプルコードを公開する。
using System; using System.Diagnostics; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport("user32.dll")] private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags); const uint GR_GDIOBJECTS = 0; const uint GR_USEROBJECTS = 1; /// <summary> /// GDI オブジェクトの数を返す /// </summary> /// <returns></returns> public static uint GetGDIObjects() { return GetGuiResources(Process.GetCurrentProcess().Handle, GR_GDIOBJECTS); } /// <summary> /// User オブジェクトの数を返す /// </summary> /// <returns></returns> public static uint GetUserObjects() { return GetGuiResources(Process.GetCurrentProcess().Handle, GR_USEROBJECTS); } static void DisplayMemory() { Console.WriteLine("Total memory : {0:###,###,###,##0} bytes", GC.GetTotalMemory(false)); Console.WriteLine("Private bytes {0:###,###,###,##0} bytes", Process.GetCurrentProcess().PrivateMemorySize64); //プライベート メモリの量 Console.WriteLine("Handle count: {0}", Process.GetCurrentProcess().HandleCount); // ハンドル数 Console.WriteLine("GDI obj count: {0}", GetGDIObjects()); Console.WriteLine("User obj count: {0}", GetUserObjects()); Console.WriteLine(); } static void Main(string[] args) { for (int i = 0; i < 100; i++) { using (var p = new Process()) { p.StartInfo.FileName = "ipconfig"; p.Start(); p.WaitForExit(); } } DisplayMemory(); GC.Collect(); //ガーベッジ コレクションを行う GC.WaitForPendingFinalizers(); //ガーベッジ コレクションが終わるまで待つ DisplayMemory(); } } }
標準出力とタスクマネージャーはこんな感じ
参照
Windows Updateを生かしたまま、アップデート後の不本意な再起動を止める方法は存在しない。Pro版でも、Enterprise版でも。
なので、Windows Updateのサービスを止めるしかない。という結論にたどり着いた。
諦めよう、Microsoftが改心するまで。
2019年現在、この記述は無効です。
CERNが開発しているROOT (バージョン5)を用いた検出器内の飛跡を2次元プロジェクションに投影して描画する方法。 具体的には三次元情報を持つ飛跡を2次元に投影したい時に使う。
#include <vector> #include <random> #include <limits> #include <TArrow.h> #include <TGraph.h> #include <TAxis.h> #include <TCanvas.h> #include <TPaveText.h> class Track { public: double px, py, ax, ay; }; int main() { std::random_device rand; std::vector<Track> vtrack; double width = 10; double height = 10; TCanvas *c1 = new TCanvas("c1", "", 1000, 1000); for (int i = 0; i < 100; i++) { Track t; t.px = double(rand()) / std::numeric_limits<unsigned int>::max() * width; t.py = double(rand()) / std::numeric_limits<unsigned int>::max() * height; t.ax = double(rand()) / std::numeric_limits<unsigned int>::max() - 0.5; t.ay = double(rand()) / std::numeric_limits<unsigned int>::max() - 0.5; vtrack.emplace_back(t); } double extz = 2; //ファクター double arrowsize = 0.01; TGraph* dummy = new TGraph(); dummy->SetPoint(0, 0, 0); //左下 dummy->SetPoint(1, width , height ); //右下 dummy->SetMarkerColor(0); //マーカー色は白に dummy->GetXaxis()->SetTitle("X"); dummy->GetXaxis()->SetLabelSize(0.04); dummy->GetXaxis()->SetTitleSize(0.04); dummy->GetYaxis()->SetTitle("Y"); dummy->GetYaxis()->SetLabelSize(0.04); dummy->GetYaxis()->SetTitleSize(0.04); dummy->SetTitle("Arrow"); dummy->Draw("AP"); //軸とポイントを描画 for (auto p : vtrack) { TArrow *arrow = new TArrow(p.px, p.py, p.px + (p.ax)*extz, p.py + (p.ay)*extz, arrowsize, ">"); arrow->SetFillColor(kBlue); arrow->SetLineColor(kBlue); arrow->SetFillStyle(1001); arrow->SetLineWidth(1); arrow->SetLineStyle(1); arrow->Draw(); } //リファレンスの矢印 double ref_px = -width / 8, ref_py = -height / 8; { TArrow *arrow = new TArrow(ref_px, ref_py, ref_px + extz, ref_py, arrowsize, ">"); arrow->SetFillColor(kRed); arrow->SetLineColor(kRed); arrow->SetFillStyle(1001); arrow->SetLineWidth(1); arrow->SetLineStyle(1); arrow->Draw(); } { TArrow *arrow = new TArrow(ref_px, ref_py, ref_px, ref_py + extz, arrowsize, ">"); arrow->SetFillColor(kRed); arrow->SetLineColor(kRed); arrow->SetFillStyle(1001); arrow->SetLineWidth(1); arrow->SetLineStyle(1); arrow->Draw(); } //リファレンスの文字 double text_px = -width / 10, text_py = -height / 10; { TPaveText *pt = new TPaveText(text_px, text_py, 0, text_py + height / 30, "br"); pt->SetFillColor(0); pt->SetLineColor(0); pt->SetShadowColor(0); TText *text = pt->AddText("1.0 [rad]"); pt->Draw(); } c1->SaveAs("Arrow.pdf"); return 0; }
作った画像