powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с потоками
5 сообщений из 5, страница 1 из 1
Работа с потоками
    #38031516
ВячеславЛ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
        private void ReadBarcodesFromPdfDocument(string fileName, BarcodeType barcodes)
        {
            PdfImageViewer pdfImageViewer = new PdfImageViewer(fileName);
            BarcodeReader reader = new BarcodeReader();
            reader.Settings.ScanBarcodeTypes = barcodes;
            for (int i = 0; i < pdfImageViewer.PageCount; i++)
            {
                string[] imageNames = pdfImageViewer.GetImageNames(i);
                for (int k = 0; k < imageNames.Length; k++)
                {
                    richTextBox1.AppendText(string.Format("Page {0}, image {1}: ", i, imageNames[k]));
                    Image barcodeImage;
                    try
                    {
                      //  barcodeImage = pdfImageViewer.GetImage(i, imageNames[k]);
                        pictureBox1.Image = pdfImageViewer.GetImage(i, imageNames[k]);
                        Bitmap image1 = new Bitmap(pictureBox1.Image);
                        Image img; 
                        Size areaSize;
                        Bitmap bm;
                        Graphics gr;
                        int jj, ii, flagg;
                        flagg = 0;
                        img = image1;
                        areaSize = image1.Size;
                        
                        areaSize.Height = image1.Height / 2;
                        areaSize.Width = image1.Width / 2;
                         for (int j = 0; j < img.Height; j += areaSize.Height/2)
                        {
                            if (j + areaSize.Height > img.Height) jj = img.Height - j;
                            else jj = areaSize.Height;
                            for (int it = 0; it < img.Width; it += areaSize.Width/2)
                            {
                                if (flagg == 0)
                                {
                                if (it + areaSize.Width > img.Width) ii = img.Width - it;
                                else ii = areaSize.Width;
                                bm = new Bitmap(ii, jj);
                                gr = Graphics.FromImage(bm);
                                gr.DrawImage(img, new Rectangle(new Point(0, 0), bm.Size), it, j, ii, jj, GraphicsUnit.Pixel);
                                gr.Flush();
                                bm.Save(Convert.ToString(it) + "x" + Convert.ToString(j) + ".png");
                         

                                    try
                                    {
                                        LuminanceSource source = new RGBLuminanceSource(bm, bm.Width, bm.Height);
                                        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
                                        Reader reader1 = new MultiFormatReader();
                                        Result result = reader1.decode(bitmap);// Это нужно выполнить в потоке


Result result = reader1.decode(bitmap);// Это нужно выполнить в потоке

Причем нужно, чтобы создались асинхронные потоки количества j*it и при успешном получении Result в одном из потоков - прекращать выполнение в остальных.

Помогите пожалуйста разобраться.
...
Рейтинг: 0 / 0
Работа с потоками
    #38031536
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВячеславЛ,
Это не С++, а C#.

Вам в другой форум. Скорее всего сюда http://www.sql.ru/forum/actualtopics.aspx?bid=34

Модератор: Тема перенесена из форума "C++".
...
Рейтинг: 0 / 0
Работа с потоками
    #38032551
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ВячеславЛПомогите пожалуйста разобраться.
Вы лучше напишите что на входе и что должно быть на выходе.И , вроде, вы используете не стандартные сборки:
BarcodeReader
PdfImageViewer

Что они делают - я не знаю
...
Рейтинг: 0 / 0
Работа с потоками
    #38034319
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static List<Thread> Threads = new List<Thread>();
        static void Main(string[] args)
        {
            //создаем i*j потоков
            CreateAndStartThreads(10,10);
           
            //создаем еще один дополнительный поток, чтобы не останавливать основной поток программы, 
            //в котором проверяем в цикле, выполнился ли хотя бы один поток до конца
            Thread WaitThread = new Thread(WaitEndThread);
            WaitThread.Start();
           
            //эмулируем остановку одного из потоков
            Console.ReadLine();
            Console.WriteLine("Убиваем 10й поток");
            Threads[10].Abort();
            
            Console.ReadLine();
        }

        static void CreateAndStartThreads(int I, int J)
        {
            for (int i = 0; i < I; i++)
            {
                for (int j = 0; j < J; j++)
                {
                    Thread thread = new Thread(Encode);
                    Threads.Add(thread);
                    thread.Start(new int[] { i, j});
                }
            }
        }

        //собственно действия, выполняемые в потоке
        static void Encode(object num)
        {
            int[] a = (int[])num;
            while (true)
            {
                Console.WriteLine("Из потока i:{0}, j:{1}", a[0], a[1]);
                Thread.Sleep(1000);
            }
        }

        //проверяем, есть ли поток, закончивший работу
        static void WaitEndThread()
        {
            while (true)
            {
                foreach(Thread thread in Threads)
                    if (!thread.IsAlive)
                    {
                        AbortAllThreads();
                        return;
                    }
            }
        }

        //убиваем все потоки
        static void AbortAllThreads()
        {
            Console.WriteLine("Останавливаем все потоки");
            foreach (Thread thread in Threads)
                thread.Abort();
        }
    }
}



На скорую руку...
В общих чертах как-то так. Внутри туташнего метода Encode вызываете Ваш reader1.decode(bitmap). Если "ок", то return => поток закончит выполнение.
Но вообще говорят, что метод Abort() для остановки потока не есть гуд.
Еще можно BackgroundWorker использовать и, вместо доп. потока с циклом на опрос живучести потоков, подписаться на событие RunWorkerCompleted.
...
Рейтинг: 0 / 0
Работа с потоками
    #38034322
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой, промазал, кому ответ )
это для ВячеславЛ
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с потоками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]