Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с потоками / 5 сообщений из 5, страница 1 из 1
09.11.2012, 12:17
    #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
09.11.2012, 12:29
    #38031536
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками
ВячеславЛ,
Это не С++, а C#.

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

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

Что они делают - я не знаю
...
Рейтинг: 0 / 0
12.11.2012, 12:07
    #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
12.11.2012, 12:08
    #38034322
Sky Dragon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с потоками
ой, промазал, кому ответ )
это для ВячеславЛ
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с потоками / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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