virtual void Run() { // filters all file paths on network drives, removable drives and // all paths which still exist from the list (remaining paths will // be marked as inexistent in gFileHistory) for (size_t i = 0; i < paths.Count() && !WasCancelRequested(); i++) { WCHAR *path = paths.At(i); if (!path || !path::IsOnFixedDrive(path) || DocumentPathExists(path)) { free(paths.PopAt(i--)); } } if (!WasCancelRequested()) uitask::Post(this); }
// layout pages from a given reparse point (beginning if NULL) // returns true if layout thread was cancelled bool EbookFormattingThread::Format(int reparseIdx) { bool fromBeginning = (0 == reparseIdx); //lf("Started laying out mobi, fromBeginning=%d", (int)fromBeginning); int totalPageCount = 0; Timer t(true); formatterArgs->reparseIdx = reparseIdx; HtmlFormatter *formatter = CreateFormatter(doc, formatterArgs); int lastReparseIdx = reparseIdx; for (HtmlPage *pd = formatter->Next(); pd; pd = formatter->Next()) { CrashIf(pd->reparseIdx < lastReparseIdx); lastReparseIdx = pd->reparseIdx; if (WasCancelRequested()) { lf("layout cancelled"); for (int i = 0; i < pageCount; i++) { delete pages[i]; } pageCount = 0; delete pd; // send a 'finished' message so that the thread object gets deleted SendPagesIfNecessary(true, true, fromBeginning); delete formatter; return true; } pages[pageCount++] = pd; ++totalPageCount; // we send first 5 pages one by one and the rest in batches to minimize user-visible // latency but also not overload ui thread SendPagesIfNecessary(totalPageCount < 5, false, fromBeginning); CrashIf(pageCount >= dimof(pages)); } // this is the last message only if we're laying out from the beginning bool finished = fromBeginning; SendPagesIfNecessary(true, finished, fromBeginning); //lf("Laying out took %.2f ms", t.GetTimeInMs()); delete formatter; return false; }
// layout pages from a given reparse point (beginning if nullptr) // returns true if layout thread was cancelled bool EbookFormattingThread::Format() { //lf("Started laying out ebook, reparseIdx=%d", reparseIdx); int totalPageCount = 0; formatterArgs->reparseIdx = 0; pagesAfterReparseIdx = 0; HtmlFormatter *formatter = doc.CreateFormatter(formatterArgs); for (HtmlPage *pd = formatter->Next(); pd; pd = formatter->Next()) { if (WasCancelRequested()) { //lf("layout cancelled"); for (int i = 0; i < pageCount; i++) { delete pages[i]; } pageCount = 0; delete pd; // send a 'finished' message so that the thread object gets deleted SendPagesIfNecessary(true, true /* finished */); delete formatter; return true; } pages[pageCount++] = pd; ++totalPageCount; if (pd->reparseIdx >= reparseIdx) { ++pagesAfterReparseIdx; } // force sending accumulated pages bool force = false; if (2 == pagesAfterReparseIdx) { force = true; //lf("EbookFormattingThread::Format: sending pages because pagesAfterReparseIdx == %d", pagesAfterReparseIdx); } SendPagesIfNecessary(force, false); CrashIf(pageCount >= dimof(pages)); } SendPagesIfNecessary(true, true /* finished */); delete formatter; return false; }