C ++新手,想在MFC应用程序中创建后台线程

时间:2015-01-15 18:15:29

标签: c# c++ multithreading mfc

我已经看了几个例子但是我找不到一个简单的方法来在我负责修改的现有C ++ MFC应用程序中创建后台线程。

我看了这篇文章 - > Multithreading: Creating Worker Threads但此代码无法正常使用。由于我是C ++的新手,我需要更多的解释,本文假设我没有使用C ++的经验。

我正在努力实现我在下面提供的C#示例中所做的工作......

此代码每分钟创建一个新文件,但在该分钟过去之前可能会写入此文件几百次并创建另一个文件。我根据日期和时间设置文件名,因此每个文件名都是唯一的。有一个标题行包含来自波长数组的项目,并且每次写入每个文件,而我想要存储的数据的后续行被多次写入。这是传入的值rawData。您可以假设数据是整数或类似的数组。每个文件创建时,ProcessHeader只发生一次。

private static double[] wavelengths;
private static System.Timers.Timer aTimer;
private static string fileNameAndPath = "";
private int count = 0;

private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
    // Create a new file once a minute
    fileNameAndPath = string.Format(@"C:\MyData_{0:yyyy-MM-dd_hh-mm-ss-tt}.csv", DateTime.Now);
    var myFile = File.Create(fileNameAndPath);
    myFile.Close();
}

private void ProcessHeader()
{
    fileNameAndPath = string.Format(@"C:\Data_{0:yyyy-MM-dd_hh-mm-ss-tt}.csv", DateTime.Now);
    var myFile = File.Create(fileNameAndPath);
    myFile.Close();
    string[] header = new string[] { string.Join(", ", wavelengths) };
    File.AppendAllLines(fileNameAndPath, header);
}

private void ShowDateTimeAndCount()
{
    // Open the file > add the date and time at the top > add a header row > add the data
    File.AppendAllText(fileNameAndPath, String.Format("Run Date: {0}\tCount: {1}{2}", DateTime.Now.ToString(), ++count, Environment.NewLine));
}

private void LogData(double[] rawData)
{
    // Create initial fileName
    if (fileNameAndPath.Length == 0)
    {
        ProcessHeader();
    }

    ShowDateTimeAndCount();

    // Detail row
    string[] data = new string[] { string.Join(", ", rawData) };
    File.AppendAllLines(fileNameAndPath, data);
}

////////////////////////////////////////////////////////////////////////
// Background Worker
////////////////////////////////////////////////////////////////////////

private void backgroundWorkerAcquisition_DoWork(object sender, DoWorkEventArgs e)
{
    // BEGIN - run once a minute
    aTimer = new System.Timers.Timer(60000);
    // Hook up the Elapsed event for the timer. 
    aTimer.Elapsed += OnTimedEvent;
    aTimer.Enabled = true;
    // END
}

可以用C ++ MFC完成吗?

1 个答案:

答案 0 :(得分:1)

您发布的代码作为示例使用计时器,而不是后台线程。因此,您与MFC线程功能的链接无关。要在MFC程序中复制计时器方法,可以在任何CWnd派生类中调用SetTimer,并在该类中为WM_TIMER添加消息处理程序。您的消息处理函数将定期调用。