return m_nTotalItems;
}
+/**\r
+* @brief Return item taking most time among current items.\r
+*/\r
+const DIFFITEM *CompareStats::GetCurDiffItem()\r
+{\r
+ int nHitCountMax = 0;\r
+ const DIFFITEM *cdi = m_rgThreadState.front().m_pDiffItem;\r
+ std::vector<ThreadState>::iterator it = m_rgThreadState.begin();\r
+ while (it != m_rgThreadState.end())\r
+ {\r
+ const DIFFITEM *di = it->m_pDiffItem;\r
+ if (di != NULL && (di->diffcode.diffcode & DIFFCODE::COMPAREFLAGS) == DIFFCODE::NOCMP)\r
+ {\r
+ int nHitCount = it->m_nHitCount++;\r
+ if (nHitCountMax < nHitCount)\r
+ {\r
+ nHitCountMax = nHitCount;\r
+ cdi = di;\r
+ }\r
+ }\r
+ ++it;\r
+ }\r
+ return cdi;\r
+}\r
+
/**
* @brief Reset comparestats.
* Use this function to reset stats before new compare.
#define POCO_NO_UNWINDOWS 1
#include <Poco/Mutex.h>
+#include <Poco/AtomicCounter.h>
+#include <vector>
+
+struct DIFFITEM;
/**
* @brief Class holding directory compare stats.
CompareStats(int nDirs);
~CompareStats();
+ void SetCompareThreadCount(int nCompareThreads)
+ {
+ m_rgThreadState.resize(nCompareThreads);
+ }
+ void BeginCompare(const DIFFITEM *di, int iCompareThread)
+ {
+ ThreadState &rThreadState = m_rgThreadState[iCompareThread];
+ rThreadState.m_nHitCount = 0;
+ rThreadState.m_pDiffItem = di;
+ }
void AddItem(int code);
void IncreaseTotalItems(int count = 1);
int GetCount(CompareStats::RESULT result) const;
int GetTotalItems() const;
int GetComparedItems() const { return m_nComparedItems; }
+ const DIFFITEM *GetCurDiffItem();
void Reset();
void SetCompareState(CompareStats::CMP_STATE state);
CompareStats::CMP_STATE GetCompareState() const;
+ void SetCurrentDiffItem(const DIFFITEM *di);
bool IsCompareDone() const { return m_bCompareDone; }
CompareStats::RESULT GetResultFromCode(unsigned diffcode) const;
CMP_STATE m_state; /**< State for compare (idle, collect, compare,..) */
bool m_bCompareDone; /**< Have we finished last compare? */
int m_nDirs; /**< number of directories to compare */
+ struct ThreadState
+ {
+ ThreadState() : m_nHitCount(0), m_pDiffItem(NULL) {}
+ Poco::AtomicCounter m_nHitCount;
+ const DIFFITEM *m_pDiffItem;
+ };
+ std::vector<ThreadState> m_rgThreadState;
+
};
#include "DirCompProgressBar.h"
#include "Merge.h"
#include "CompareStats.h"
+#include "DiffContext.h"
+#include "paths.h"
#ifdef _DEBUG
#define new DEBUG_NEW
static const UINT IDT_UPDATE = 1;
/** @brief Interval (in milliseconds) for UI updates. */
-static const UINT UPDATE_INTERVAL = 400;
+static const UINT UPDATE_INTERVAL = 600;
/** @brief Reset all UI fields to zero. */
void DirCompProgressBar::ClearStat()
* @brief Constructor.
* @param [in] pParent Parent window for progress dialog.
*/
-DirCompProgressBar::DirCompProgressBar()
+DirCompProgressBar::DirCompProgressBar(const CDiffContext& ctxt)
: m_bCompareReady(FALSE)
, m_prevState(CompareStats::STATE_IDLE)
, m_pCompareStats(NULL)
+, m_ctxt(ctxt)
#ifdef __ITaskbarList3_INTERFACE_DEFINED__
, m_pTaskbarList(NULL)
#endif
state == CompareStats::STATE_COMPARE)
{
SetProgressState(m_pCompareStats->GetComparedItems(), m_pCompareStats->GetTotalItems());
+ if (const DIFFITEM *pdi = m_pCompareStats->GetCurDiffItem())\r
+ {\r
+ for (int i = 0; i < m_ctxt.GetCompareDirs(); ++i)\r
+ GetDlgItem(IDC_PATH0_STATIC + i)->SetWindowTextW(\r
+ paths_ConcatPath(m_ctxt.GetPath(i), pdi->diffFileInfo[i].GetFile()).c_str());\r
+ }\r
}
// Compare is ready
// Update total items too since we might get only this one state
rectProgress.right = cx - rectProgress.left;
pwndButton->SetWindowPos(NULL, rectButton.left, rectButton.top, 0, 0, SWP_NOZORDER|SWP_NOSIZE);
pwndProgress->SetWindowPos(NULL, 0, 0, rectProgress.Width(), rectProgress.Height(), SWP_NOZORDER|SWP_NOMOVE);
+ for (int i = 0; i < 3; ++i)
+ {
+ CWnd *pwndStatic = GetDlgItem(IDC_PATH0_STATIC + i);
+ CRect rectStatic;
+ pwndStatic->GetWindowRect(&rectStatic);
+ ScreenToClient(&rectStatic);
+ rectStatic.right = rectButton.left - 4;
+ pwndStatic->SetWindowPos(NULL, 0, 0, rectStatic.Width(), rectStatic.Height(), SWP_NOZORDER|SWP_NOMOVE);
+ }
}
}
#include "CompareStats.h"
class ITaskBarList3;
+class CDiffContext;
/////////////////////////////////////////////////////////////////////////////
// DirCompProgressBar dialog
{
// Construction
public:
- DirCompProgressBar(); // standard constructor
+ DirCompProgressBar(const CDiffContext& ctxt); // standard constructor
~DirCompProgressBar();
BOOL Create(CWnd* pParentWnd);
void SetCompareStat(CompareStats * pCompareStats);
#ifdef __ITaskbarList3_INTERFACE_DEFINED__
ITaskbarList3 *m_pTaskbarList;
#endif
+ const CDiffContext& m_ctxt;
};
//{{AFX_INSERT_LOCATION}}
class DiffWorker: public Runnable
{
public:
- DiffWorker(NotificationQueue& queue, CDiffContext *pCtxt):
- m_queue(queue), m_pCtxt(pCtxt) {}
+ DiffWorker(NotificationQueue& queue, CDiffContext *pCtxt, int id):
+ m_queue(queue), m_pCtxt(pCtxt), m_id(id) {}
void run()
{
{
WorkNotification* pWorkNf = dynamic_cast<WorkNotification*>(pNf.get());
if (pWorkNf) {
+ m_pCtxt->m_pCompareStats->BeginCompare(&pWorkNf->data(), m_id);
if (!m_pCtxt->ShouldAbort())
CompareDiffItem(pWorkNf->data(), m_pCtxt);
pWorkNf->queueResult().enqueueNotification(new WorkCompletedNotification(pWorkNf->data()));
private:
NotificationQueue& m_queue;
CDiffContext *m_pCtxt;
+ int m_id;
};
typedef std::shared_ptr<DiffWorker> DiffWorkerPtr;
size_t nworkers = (compareMethod == CMP_CONTENT || compareMethod == CMP_QUICK_CONTENT) ? Environment::processorCount() : 1;
NotificationQueue queue;
+ myStruct->context->m_pCompareStats->SetCompareThreadCount(nworkers);
for (size_t i = 0; i < nworkers; ++i)
{
- workers.push_back(DiffWorkerPtr(new DiffWorker(queue, myStruct->context)));
+ workers.push_back(DiffWorkerPtr(new DiffWorker(queue, myStruct->context, i)));
threadPool.start(*workers[i]);
}
void CDirView::StartCompare(CompareStats *pCompareStats)
{
if (m_pCmpProgressBar == NULL)
- m_pCmpProgressBar.reset(new DirCompProgressBar());
+ m_pCmpProgressBar.reset(new DirCompProgressBar(GetDocument()->GetDiffContext()));
if (!::IsWindow(m_pCmpProgressBar->GetSafeHwnd()))
m_pCmpProgressBar->Create(GetParentFrame());
ES_READONLY
END
-IDD_DIRCOMP_PROGRESS DIALOGEX 0, 0, 256, 60
+IDD_DIRCOMP_PROGRESS DIALOGEX 0, 0, 256, 64
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
DEFPUSHBUTTON "Stop",IDC_COMPARISON_STOP,167,15,83,14
- CONTROL "",IDC_PROGRESSCOMPARE,"msctls_progress32",WS_BORDER,9,
- 44,241,9
+ CONTROL "",IDC_PROGRESSCOMPARE,"msctls_progress32",WS_BORDER,7,
+ 49,241,9
RTEXT "0",IDC_ITEMSCOMPARED,95,29,30,9
RTEXT "0",IDC_ITEMSTOTAL,95,19,30,9
LTEXT "Comparing items...",IDC_STATIC,7,7,150,9
LTEXT "Items compared:",IDC_STATIC,7,29,85,9
LTEXT "Items total:",IDC_STATIC,7,19,85,9
+ LTEXT "", IDC_PATH0_STATIC, 137, 19, 242, 9\r
+ LTEXT "", IDC_PATH1_STATIC, 137, 29, 242, 9\r
+ LTEXT "", IDC_PATH2_STATIC, 137, 39, 242, 9
END
IDD_WMGOTO DIALOGEX 0, 0, 210, 80
#define IDC_SWAP02_BUTTON 1354
#define IDC_COLORSCHEME_GITHUBBITBUCKET 1355
#define IDC_FINDDLG_DONTCLOSE 1356
+#define IDC_PATH0_STATIC 1357
+#define IDC_PATH1_STATIC 1358
+#define IDC_PATH2_STATIC 1359
#define IDC_EDIT_WHOLE_WORD 8603
#define IDC_EDIT_MATCH_CASE 8604
#define IDC_EDIT_FINDTEXT 8605
#define _APS_3D_CONTROLS 1
#define _APS_NEXT_RESOURCE_VALUE 242
#define _APS_NEXT_COMMAND_VALUE 33273
-#define _APS_NEXT_CONTROL_VALUE 1358
+#define _APS_NEXT_CONTROL_VALUE 1361
#define _APS_NEXT_SYMED_VALUE 115
#endif
#endif