Beispiel #1
0
        internal Word(
            StringPointerBuilder stringPointerBuilder,
            string hanzi, string traditional, string thumbPinyin, string thumbTranslation, string radicals, string link,
            MeaningListBuilder meaningBuilder, StringPointerBuilder tagBuilder, ulong pinyinMask)
        {
            WordStart = stringPointerBuilder.StringPointers.Count;

            stringPointerBuilder.Add(hanzi);
            stringPointerBuilder.Add(traditional);
            stringPointerBuilder.Add(thumbPinyin);
            stringPointerBuilder.Add(thumbTranslation);
            stringPointerBuilder.Add(radicals);
            stringPointerBuilder.Add(link);

            stringPointerBuilder.Append(meaningBuilder.Pinyins);
            stringPointerBuilder.Append(meaningBuilder.Translations);
            stringPointerBuilder.Append(tagBuilder);

            PinyinListLength      = (byte)meaningBuilder.Pinyins.StringPointers.Count;
            TranslationListLength = (byte)meaningBuilder.Translations.StringPointers.Count;
            TagListLength         = (byte)tagBuilder.StringPointers.Count;

            MeaningsMemory = new MeaningListMemory(meaningBuilder);

            PinyinMask = pinyinMask;
        }
Beispiel #2
0
        private async Task LoadDictionaryTask()
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            // spawn jobs
            List <DictionaryLoadJob> dictionaryLoadJobs = await GetDictionaryLoadJobs();

            List <Task> jobTasks = new List <Task>();

            foreach (DictionaryLoadJob dictionaryLoadJob in dictionaryLoadJobs)
            {
                jobTasks.Add(Task.Run((Action)dictionaryLoadJob.LoadDictionaryPart, LoadTaskCanceller.Token));
            }

            // wait for all jobs to complete
            Task.WaitAll(jobTasks.ToArray(), LoadTaskCanceller.Token);

            // merge results
            StringPointerBuilder stringBuilder        = new StringPointerBuilder();
            List <MeaningMemory> meaningMemoryBuilder = new List <MeaningMemory>();

            List <Word> words = new List <Word>();

            foreach (DictionaryLoadJob dictionaryLoadJob in dictionaryLoadJobs)
            {
                foreach (Word word in dictionaryLoadJob.Words)
                {
                    word.WordStart += stringBuilder.StringPointers.Count;
                    word.MeaningsMemory.MeaningStart += meaningMemoryBuilder.Count;
                }
                words.AddRange(dictionaryLoadJob.Words);

                stringBuilder.Append(dictionaryLoadJob.StringBuilder);
                meaningMemoryBuilder.AddRange(dictionaryLoadJob.MeaningBuilder.MeaningMemory);
            }

            WordDictionary.SetDictionary(
                DictionaryName,
                words,
                stringBuilder.StringBuilder.ToString(),
                stringBuilder.StringPointers.ToArray(),
                meaningMemoryBuilder.ToArray());

            foreach (DictionaryLoadJob dictionaryLoadJob in dictionaryLoadJobs)
            {
                dictionaryLoadJob.Dispose();
            }

            SortDictionaryWords();
            await BuildIndex();

            stopwatch.Stop();
            Debug.WriteLine("Loaded dictionary {1} in 0.{0:fffffff}", stopwatch.Elapsed, DictionaryName);

            WordDictionary.Loading.IsCompleted = true;
            WordDictionary.Loading.DictionaryLoadedNotifier.Set();
        }