X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=win%2FC%23%2FfrmActivityWindow.cs;h=9509500a61036066dc2b4ba7154f7912baf044cb;hb=b4464b6d962bb939a8f38b4d50057c441ab48111;hp=d2d1ff17a99a5360f6f5bd4f9412bfb66f947443;hpb=f9bc34ea53711d0cc1efbfb0937434a80999ea19;p=handbrake-jp%2Fhandbrake-jp-git.git
diff --git a/win/C#/frmActivityWindow.cs b/win/C#/frmActivityWindow.cs
index d2d1ff17..9509500a 100644
--- a/win/C#/frmActivityWindow.cs
+++ b/win/C#/frmActivityWindow.cs
@@ -5,10 +5,12 @@
It may be used under the terms of the GNU General Public License. */
using System;
+using System.ComponentModel;
using System.Windows.Forms;
using System.IO;
using System.Threading;
-using System.Runtime.InteropServices;
+using Handbrake.EncodeQueue;
+using Handbrake.Functions;
using Microsoft.Win32;
@@ -16,46 +18,53 @@ namespace Handbrake
{
public partial class frmActivityWindow : Form
{
- delegate void SetTextCallback(string text);
- String read_file;
- Thread monitor;
- Queue.QueueHandler encodeQueue;
- int position; // Position in the arraylist reached by the current log output in the rtf box.
- string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
-
- ///
- /// This window should be used to display the RAW output of the handbrake CLI which is produced during an encode.
- ///
- public frmActivityWindow(string file, Queue.QueueHandler eh)
+ private delegate void setTextCallback(string text);
+ private String _readFile;
+ private readonly EncodeAndQueueHandler _encodeQueue;
+ private int _position; // Position in the arraylist reached by the current log output in the rtf box.
+ private readonly frmMain _mainWin;
+ private Boolean _lastUpdate;
+ private Boolean fileNotFoundQuickFix;
+
+ public frmActivityWindow(string file, EncodeAndQueueHandler eh, frmMain mw)
{
InitializeComponent();
- rtf_actLog.Text = string.Empty;
- encodeQueue = eh;
- read_file = file;
- position = 0;
-
- // When the window closes, we want to abort the monitor thread.
- this.Disposed += new EventHandler(forceQuit);
+ _encodeQueue = eh;
+ _mainWin = mw;
- // Print the Log header in the Rich text box.
- displayLogHeader();
+ fileNotFoundQuickFix = false;
if (file == "last_scan_log.txt")
- txt_log.Text = "Scan Log";
- else if (file == "last_encode_log.txt")
- txt_log.Text = "Encode Log";
+ SetLogView(true);
+ else
+ SetLogView(false);
// Start a new thread which will montior and keep the log window up to date if required/
- startLogThread(read_file);
+ try
+ {
+ Thread monitor = new Thread(AutoUpdate) { IsBackground = true };
+ monitor.Start();
+ }
+ catch (Exception exc)
+ {
+ MessageBox.Show("startLogThread(): Exception: \n" + exc, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
}
///
- /// Displays the Log header
+ /// Set the view which the Log window displays.
+ /// Scan = true;
+ /// Encode = false;
///
- private void displayLogHeader()
+ /// Boolean. Scan = true
+ public void SetLogView(Boolean scan)
{
- // Add a header to the log file indicating that it's from the Windows GUI and display the windows version
+ // Reset
+ _position = 0;
+ rtf_actLog.Text = String.Empty;
+
+ // Print the log header
rtf_actLog.AppendText(String.Format("### Windows GUI {1} {0} \n", Properties.Settings.Default.hb_build, Properties.Settings.Default.hb_version));
rtf_actLog.AppendText(String.Format("### Running: {0} \n###\n", Environment.OSVersion));
rtf_actLog.AppendText(String.Format("### CPU: {0} \n", getCpuCount()));
@@ -65,85 +74,61 @@ namespace Handbrake
rtf_actLog.AppendText(String.Format("### Install Dir: {0} \n", Application.StartupPath));
rtf_actLog.AppendText(String.Format("### Data Dir: {0} \n", Application.UserAppDataPath));
rtf_actLog.AppendText("#########################################\n\n");
- if (encodeQueue.isEncoding && encodeQueue.lastQueueItem.Query != String.Empty)
+ if ((!_encodeQueue.LastEncode.IsEmpty) && _encodeQueue.LastEncode.Query != String.Empty)
{
- rtf_actLog.AppendText("### CLI Query: " + encodeQueue.lastQueueItem.Query + "\n\n");
+ rtf_actLog.AppendText("### CLI Query: " + _encodeQueue.LastEncode.Query + "\n\n");
rtf_actLog.AppendText("#########################################\n\n");
}
- }
- ///
- /// Starts a new thread which runs the autoUpdate function.
- ///
- /// File which will be used to populate the Rich text box.
- private void startLogThread(string file)
- {
- try
+ // Seutp the log file
+ if (scan)
{
- string logFile = Path.Combine(logDir, file);
- if (File.Exists(logFile))
- {
- // Start a new thread to run the autoUpdate process
- monitor = new Thread(autoUpdate);
- monitor.IsBackground = true;
- monitor.Start();
- }
- else
- rtf_actLog.AppendText("\n\n\nERROR: The log file could not be found. \nMaybe you cleared your system's tempory folder or maybe you just havn't run an encode yet. \nTried to find the log file in: " + logFile);
-
+ txt_log.Text = "Scan Log";
+ _readFile = "last_scan_log.txt";
}
- catch (Exception exc)
+ else
{
- MessageBox.Show("startLogThread(): Exception: \n" + exc);
+ _readFile = "last_encode_log.txt";
+ txt_log.Text = "Encode Log";
}
+ _lastUpdate = false;
}
- ///
- /// Updates the log window with any new data which is in the log file.
- /// This is done every 5 seconds.
- ///
- ///
- private void autoUpdate(object state)
+ private void AutoUpdate(object state)
{
try
{
- Boolean lastUpdate = false;
- updateTextFromThread();
+ _lastUpdate = false;
+ UpdateTextFromThread();
while (true)
{
- if (encodeQueue.isEncoding)
- updateTextFromThread();
- else
+ if (IsHandleCreated)
{
- // The encode may just have stoped, so, refresh the log one more time before restarting it.
- if (lastUpdate == false)
- updateTextFromThread();
-
- lastUpdate = true; // Prevents the log window from being updated when there is no encode going.
- position = 0; // There is no encoding, so reset the log position counter to 0 so it can be reused
+ if (_encodeQueue.isEncoding || _mainWin.isScanning)
+ UpdateTextFromThread();
+ else
+ {
+ // The encode may just have stoped, so, refresh the log one more time before restarting it.
+ if (_lastUpdate == false)
+ UpdateTextFromThread();
+
+ _lastUpdate = true; // Prevents the log window from being updated when there is no encode going.
+ _position = 0; // There is no encoding, so reset the log position counter to 0 so it can be reused
+ }
}
- Thread.Sleep(5000);
+ Thread.Sleep(1000);
}
}
- catch (ThreadAbortException)
- {
- // Do Nothing. This is needed since we run thread.abort().
- // Should probably find a better way of making this work at some point.
- }
catch (Exception exc)
{
- MessageBox.Show("autoUpdate(): Exception: \n" + exc);
+ MessageBox.Show("AutoUpdate(): Exception: \n" + exc);
}
}
-
- ///
- /// Finds any new text in the log file and calls a funciton to display this new text.
- ///
- private void updateTextFromThread()
+ private void UpdateTextFromThread()
{
try
{
- String info = readFile();
+ String info = ReadFile();
if (info.Contains("has exited"))
info += "\n ############ End of Log ############## \n";
@@ -151,27 +136,19 @@ namespace Handbrake
}
catch (Exception exc)
{
- MessageBox.Show("updateTextFromThread(): Exception: \n" + exc);
+ MessageBox.Show("UpdateTextFromThread(): Exception: \n" + exc);
}
}
-
- ///
- /// Updates the rich text box with anything in the string text.
- ///
- ///
private void SetText(string text)
{
try
{
- // InvokeRequired required compares the thread ID of the
- // calling thread to the thread ID of the creating thread.
- // If these threads are different, it returns true.
- if (IsHandleCreated) // Make sure the windows has a handle before doing anything
+ if (IsHandleCreated)
{
if (rtf_actLog.InvokeRequired)
{
- SetTextCallback d = new SetTextCallback(SetText);
- Invoke(d, new object[] { text });
+ IAsyncResult invoked = BeginInvoke(new setTextCallback(SetText), new object[] { text });
+ EndInvoke(invoked);
}
else
rtf_actLog.AppendText(text);
@@ -182,19 +159,15 @@ namespace Handbrake
MessageBox.Show("SetText(): Exception: \n" + exc);
}
}
-
- ///
- /// Read the log file, and store the data in a List.
- ///
- ///
- private String readFile()
+ private String ReadFile()
{
String appendText = String.Empty;
try
{
// last_encode_log.txt is the primary log file. Since .NET can't read this file whilst the CLI is outputing to it (Not even in read only mode),
// we'll need to make a copy of it.
- string logFile = Path.Combine(logDir, read_file);
+ string logDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\HandBrake\\logs";
+ string logFile = Path.Combine(logDir, _readFile);
string logFile2 = Path.Combine(logDir, "tmp_appReadable_log.txt");
// Make sure the application readable log file does not already exist. FileCopy fill fail if it does.
@@ -202,18 +175,25 @@ namespace Handbrake
File.Delete(logFile2);
// Copy the log file.
- File.Copy(logFile, logFile2);
-
- // Open the copied log file for reading
+ if (File.Exists(logFile))
+ File.Copy(logFile, logFile2, true);
+ else
+ {
+ if (fileNotFoundQuickFix)
+ return "";
+ fileNotFoundQuickFix = true;
+ return "\n\n\nERROR: The log file could not be found. \nMaybe you cleared your system's tempory folder or maybe you just havn't run an encode yet. \nTried to find the log file in: " + logFile;
+ }
+
StreamReader sr = new StreamReader(logFile2);
string line;
int i = 1;
while ((line = sr.ReadLine()) != null)
{
- if (i > position)
+ if (i > _position)
{
appendText += line + Environment.NewLine;
- position++;
+ _position++;
}
i++;
}
@@ -224,29 +204,18 @@ namespace Handbrake
}
catch (Exception exc)
{
- MessageBox.Show("Error in readFile() \n Unable to read the log file.\n You may have to restart HandBrake.\n Error Information: \n\n" + exc, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return "Error in ReadFile() \n Unable to read the log file.\n You may have to restart HandBrake. Will try reading the file again in a few seconds... \n Error Information: \n\n" + exc;
}
- return null;
}
- ///
- /// Kills the montior thead when the window is disposed of.
- ///
- ///
- ///
- private void forceQuit(object sender, EventArgs e)
+ protected override void OnClosing(CancelEventArgs e)
{
- if (monitor != null)
- {
- while (monitor.IsAlive)
- monitor.Abort();
- }
-
- this.Close();
+ e.Cancel = true;
+ this.Hide();
+ base.OnClosing(e);
}
#region User Interface
-
private void mnu_copy_log_Click(object sender, EventArgs e)
{
if (rtf_actLog.SelectedText != "")
@@ -272,61 +241,23 @@ namespace Handbrake
}
private void btn_scan_log_Click(object sender, EventArgs e)
{
- // Switch to the scan log.
-
- if (monitor != null)
- monitor.Abort();
-
- rtf_actLog.Clear();
- read_file = "last_scan_log.txt";
- displayLogHeader();
- startLogThread(read_file);
- txt_log.Text = "Scan Log";
+ SetLogView(true);
}
private void btn_encode_log_Click(object sender, EventArgs e)
{
- // Switch to the encode log
-
- if (monitor != null)
- monitor.Abort();
-
- rtf_actLog.Clear();
- read_file = "last_encode_log.txt";
- position = 0;
- displayLogHeader();
- startLogThread(read_file);
- txt_log.Text = "Encode Log";
+ SetLogView(false);
}
-
#endregion
#region System Information
- private struct MEMORYSTATUS // Unused var's are requred here.
- {
- public UInt32 dwLength;
- public UInt32 dwMemoryLoad;
- public UInt32 dwTotalPhys; // Used
- public UInt32 dwAvailPhys;
- public UInt32 dwTotalPageFile;
- public UInt32 dwAvailPageFile;
- public UInt32 dwTotalVirtual;
- public UInt32 dwAvailVirtual;
- }
-
- [DllImport("kernel32.dll")]
- private static extern void GlobalMemoryStatus
- (
- ref MEMORYSTATUS lpBuffer
- );
-
///
/// Returns the total physical ram in a system
///
///
public uint TotalPhysicalMemory()
{
- MEMORYSTATUS memStatus = new MEMORYSTATUS();
- GlobalMemoryStatus(ref memStatus);
+ Win32.MEMORYSTATUS memStatus = new Win32.MEMORYSTATUS();
+ Win32.GlobalMemoryStatus(ref memStatus);
uint MemoryInfo = memStatus.dwTotalPhys;
MemoryInfo = MemoryInfo / 1024 / 1024;
@@ -353,7 +284,6 @@ namespace Handbrake
{
return Screen.PrimaryScreen;
}
-
#endregion
}