You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
10 KiB
C#
300 lines
10 KiB
C#
using IPCLib;
|
|
using RunWellSectionApp;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using System.Threading;
|
|
|
|
namespace RunWellSectionApp
|
|
{
|
|
partial class Form1
|
|
{
|
|
//IpcPipeClass m_ipcPipeWellPole = null;
|
|
IpcMmfClass m_ipcMmfWellPole = null;
|
|
private void OnMessageReceived(PipeMessage msg)
|
|
{
|
|
if (this.InvokeRequired)
|
|
{
|
|
this.Invoke(new Action<PipeMessage>(OnMessageReceived), msg);
|
|
return;
|
|
}
|
|
UpdateStatus($"收到 B: [{msg.Timestamp}] {msg.Content}");
|
|
}
|
|
|
|
//private void OnConnectionStatusChanged(bool connected)
|
|
//{
|
|
// if (this.InvokeRequired)
|
|
// {
|
|
// this.Invoke(new Action<bool>(OnConnectionStatusChanged), connected);
|
|
// return;
|
|
// }
|
|
|
|
// //var lblStatus = this.Controls.Find("lblStatus", true)[0] as Label;
|
|
// if (connected)
|
|
// {
|
|
// m_ipcPipeWellPole.m_bUsePipe = true;
|
|
// m_ipcPipeWellPole.m_heartbeatTimeoutCount = 0;
|
|
// UpdateStatus("状态:已连接 (心跳正常)");
|
|
// }
|
|
// else
|
|
// {
|
|
// // lblStatus.Text = "状态:断开";
|
|
// m_ipcPipeWellPole.m_bUsePipe = false;
|
|
// UpdateStatus("状态:断开");
|
|
// Trace.WriteLine("状态:断开");
|
|
// }
|
|
//}
|
|
//private void OnHeartbeatTimeout()
|
|
//{
|
|
// if (this.InvokeRequired)
|
|
// {
|
|
// this.Invoke(new Action(OnHeartbeatTimeout));
|
|
// return;
|
|
// }
|
|
|
|
// m_ipcPipeWellPole.m_heartbeatTimeoutCount++;
|
|
|
|
// UpdateStatus($"状态:心跳超时 ({m_ipcPipeWellPole.m_heartbeatTimeoutCount} 次)");
|
|
// if (m_ipcPipeWellPole.m_heartbeatTimeoutCount >= 3)
|
|
// {
|
|
// //AddLog("错误:连续心跳超时,尝试重启进程 B");
|
|
// m_ipcPipeWellPole.m_heartbeatTimeoutCount = 0;
|
|
// }
|
|
//}
|
|
|
|
private void OnMmfConnected()
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(OnMmfConnected)); return; }
|
|
|
|
UpdateStatus($"建立连接");
|
|
|
|
}
|
|
|
|
private void OnMmfDisconnected(string reason)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnMmfDisconnected(reason))); return; }
|
|
UpdateStatus($"断开");
|
|
m_ipcMmfWellPole.m_process = null;
|
|
m_ipcMmfWellPole.m_bUse = false;
|
|
}
|
|
|
|
private void OnMmfDataReceived(string data)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnMmfDataReceived(data))); return; }
|
|
|
|
UpdateStatus($"收到 B: [{data}]");
|
|
}
|
|
|
|
private void OnMmfProcessBExited(object sender, EventArgs e)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnMmfProcessBExited(sender, e))); return; }
|
|
|
|
if (m_ipcMmfWellPole.m_process != null)
|
|
{
|
|
UpdateStatus($"B 进程已退出 (ExitCode: {m_ipcMmfWellPole.m_process?.ExitCode})");
|
|
m_ipcMmfWellPole.m_process?.Dispose();
|
|
m_ipcMmfWellPole.m_process = null;
|
|
m_ipcMmfWellPole.m_bUse = false;
|
|
}
|
|
}
|
|
|
|
private void OnMmfPeerFrozen(string reason)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnMmfPeerFrozen(reason))); return; }
|
|
UpdateStatus($"[{DateTime.Now}] ⚠️ {reason}\n");
|
|
}
|
|
|
|
//private void OnMmfPeerFrozen(string reason)
|
|
//{
|
|
// if (InvokeRequired) { Invoke(new Action(() => OnMmfPeerFrozen(reason))); return; }
|
|
// UpdateStatus("通讯死机");
|
|
//}
|
|
|
|
//private void OnMmfPeerRecovered(string reason)
|
|
//{
|
|
// if (InvokeRequired) { Invoke(new Action(() => OnMmfPeerRecovered(reason))); return; }
|
|
// UpdateStatus("通讯恢复");
|
|
//}
|
|
|
|
private void OnMmfError(string msg)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnMmfError(msg))); return; }
|
|
UpdateStatus("通讯错误" + msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// ////////////////////////////
|
|
/// </summary>
|
|
/// <param name="newWellName"></param>
|
|
/// <param name="wellsName"></param>
|
|
void startWellProcess(string newWellName, string wellsName)
|
|
{
|
|
//if (m_ipcPipeWellPole.m_process == null || m_ipcPipeWellPole.m_bUsePipe == false)
|
|
if(m_ipcMmfWellPole.m_process == null || m_ipcMmfWellPole.m_bUse == false)
|
|
{
|
|
string fileName = ".\\KEVisualization_wellPole.exe";
|
|
if (!File.Exists(fileName))
|
|
{
|
|
MessageBox.Show("没有井剖面启动程序");
|
|
return;
|
|
}
|
|
|
|
// m_ipcMmfWellPole.m_mmf.ResetSharedMemoryState();
|
|
Thread.Sleep(300);
|
|
//InitIpc();
|
|
//m_ipcWellPole.m_Port = PortHelper.FindAvailablePort(6790);
|
|
|
|
//string args = $" \"workAreaPath={prjfileNamePath}\" \"PipeId={m_ipcPipeWellPole.m_pipeId}\"";
|
|
string args = $" \"workAreaPath={prjfileNamePath}\" \"MemoryId={m_ipcMmfWellPole.m_MemoryId}\"";
|
|
if (newWellName != "")
|
|
{
|
|
args = args + $" \"newWell={newWellName}\"";
|
|
}
|
|
else if (wellsName != "")
|
|
{
|
|
args = args + $" \"newWellsSection={wellsName}\"";
|
|
}
|
|
var startInfo = new ProcessStartInfo
|
|
{
|
|
FileName = fileName,
|
|
Arguments = args,
|
|
UseShellExecute = false,
|
|
CreateNoWindow = false
|
|
};
|
|
try
|
|
{
|
|
m_ipcMmfWellPole.m_process = Process.Start(startInfo);
|
|
m_ipcMmfWellPole.m_bUse = true;
|
|
if(m_ipcMmfWellPole.m_process != null)
|
|
{
|
|
m_ipcMmfWellPole.m_process.EnableRaisingEvents = true;
|
|
m_ipcMmfWellPole.m_process.Exited += OnWellPoleExited;
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MessageBox.Show("井剖面模块不能启动,请检查");
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnWellPoleExited(object sender, EventArgs e)
|
|
{
|
|
if (InvokeRequired) { Invoke(new Action(() => OnWellPoleExited(sender, e))); return; }
|
|
|
|
if (m_ipcMmfWellPole.m_process != null)
|
|
{
|
|
UpdateStatus($"WellPole 进程已退出 (ExitCode: {m_ipcMmfWellPole.m_process.ExitCode})");
|
|
//m_ipcMmfWellPole.m_process?.Dispose();
|
|
m_ipcMmfWellPole.m_process = null;
|
|
m_ipcMmfWellPole.m_bUse = false;
|
|
}
|
|
// ✅ B 退出后,共享内存状态保留,等下次启动时清理
|
|
}
|
|
|
|
async void runWellPole(string newWellName, string wellsName)
|
|
{
|
|
if (m_ipcMmfWellPole == null)
|
|
{
|
|
m_ipcMmfWellPole = new IpcMmfClass();
|
|
m_ipcMmfWellPole.Init(OnMmfDataReceived, OnMmfConnected, OnMmfDisconnected,OnMmfPeerFrozen,OnMmfError);
|
|
|
|
//await m_ipcMmfWellPole.m_mmf.StartAsync();
|
|
|
|
startWellProcess(newWellName, wellsName);
|
|
|
|
return;
|
|
}
|
|
|
|
if (m_ipcMmfWellPole.m_bUse == false)
|
|
{
|
|
startWellProcess(newWellName, wellsName);
|
|
}
|
|
else
|
|
{
|
|
string args = "";
|
|
if (newWellName != "")
|
|
{
|
|
args = args + $"newWell={newWellName}";
|
|
}
|
|
else if (wellsName != "")
|
|
{
|
|
args = args + $"newWellsSection={wellsName}";
|
|
}
|
|
|
|
m_ipcMmfWellPole.m_mmf.SendData(args);
|
|
}
|
|
//if (m_ipcPipeWellPole == null)
|
|
//{
|
|
// m_ipcPipeWellPole = new IpcPipeClass();
|
|
// m_ipcPipeWellPole.InitUsePiple(OnMessageReceived, OnConnectionStatusChanged, OnHeartbeatTimeout);
|
|
// startWellProcess(newWellName, wellsName);
|
|
|
|
// await m_ipcPipeWellPole.m_Pipe.StartAsync();
|
|
// return;
|
|
//}
|
|
|
|
//if (m_ipcPipeWellPole.m_bUsePipe == false)
|
|
//{
|
|
// startWellProcess(newWellName, wellsName);
|
|
//}
|
|
//else
|
|
//{
|
|
// string args = "";
|
|
// if (newWellName != "")
|
|
// {
|
|
// args = args + $"newWell={newWellName}";
|
|
// }
|
|
// else if (wellsName != "")
|
|
// {
|
|
// args = args + $"newWellsSection={wellsName}";
|
|
// }
|
|
|
|
// PipeMessage msg = new PipeMessage { Type = MessageType.Data, Content = args, Timestamp = DateTime.Now };
|
|
// m_ipcPipeWellPole.m_Pipe.SendAsync(msg);
|
|
|
|
//}
|
|
}
|
|
|
|
public void createNewWellPole(string newWellName) //生成单井柱启动函数
|
|
{
|
|
runWellPole(newWellName, "");
|
|
}
|
|
|
|
public void createNewWellsSection(List<string> newWells)//生成多井剖面启动函数
|
|
{
|
|
if (newWells == null)
|
|
runWellPole("", "");
|
|
else
|
|
{
|
|
if (newWells.Count == 0)
|
|
{
|
|
runWellPole("", "");
|
|
}
|
|
else
|
|
{
|
|
string wellsname = "";
|
|
for (int i = 0; i < newWells.Count; i++)
|
|
{
|
|
wellsname = wellsname + '|' + newWells[i];
|
|
}
|
|
|
|
wellsname = wellsname.TrimStart('|');
|
|
|
|
runWellPole("", wellsname);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void startWellPole()
|
|
{
|
|
runWellPole("", "");
|
|
}
|
|
|
|
}
|
|
} |