Нарисуйте линию между двумя подзаговорами

У меня есть два массива по 2 на n, представляющих 2d-точки. Эти два массива изображены на одном и том же рисунке, но на двух разных вспомогательных участках. Для каждой точки в одном из массивов есть соответствующая точка в другом массиве. Я хочу показать это соответствие, рисуя линию от одного из участков до другого участка.

Решения, которые я нашел, выглядят примерно так:

 ah=axes('position',[.2,.2,.6,.6],'visible','off'); % <- select your pos...
 line([.1,.9],[.1,.9],'parent',ah,'linewidth',5);

Это строит линию в системе координат, заданной вызовом осей. Чтобы это работало для меня, мне нужен способ изменить систему координат между системой подзаговоров и новой системой. Кто-нибудь знает, как это можно сделать?

Может быть, есть другой способ сделать это. Если это так, я хотел бы знать. вот код #include #include #include using ...

У меня проблема с порядком выполнения потоков, созданных последовательно. Вот код.

#include <iostream>
#include <Windows.h>
#include <boost/thread.hpp>

using namespace std;

boost::mutex mutexA;
boost::mutex mutexB;
boost::mutex mutexC;
boost::mutex mutexD;


void SomeWork(char letter, int index)
{
    boost::mutex::scoped_lock lock;
    switch(letter)
    {
    case 'A' : lock = boost::mutex::scoped_lock(mutexA); break;
    case 'B' : lock = boost::mutex::scoped_lock(mutexB); break;
    case 'C' : lock = boost::mutex::scoped_lock(mutexC); break;
    case 'D' : lock = boost::mutex::scoped_lock(mutexD); break;
    }

    cout << letter <<index << " started" << endl;
    Sleep(800);
    cout << letter<<index << " finished" << endl; 
}

int main(int argc , char * argv[])
{
    for(int i = 0; i < 16; i++)
    {
        char x = rand() % 4 + 65;
        boost::thread tha = boost::thread(SomeWork,x,i);
        Sleep(10);
    }
Sleep(6000);
    system("PAUSE");
  return 0;
}

каждый раз, когда буква (от A до D) и идентификатор зоны (i) передаются методу SomeWork как поток. меня не волнует порядок выполнения между буквами, но для букв в форме буквы, скажем, A, Ax должен начинаться раньше Ay, если x

B0 started  
D1 started  
C2 started  
A3 started  
B0 finished  
B12 started  
D1 finished  
D15 started  
C2 finished  
C6 started  
A3 finished  
A9 started
B12 finished
B11 started --> B11 started after B12 finished.
D15 finished
D13 started
C6 finished
C7 started
A9 finished

как можно избежать таких условий?
спасибо.


я решил проблему с помощью условных переменных. но я немного изменил проблему. Решение состоит в том, чтобы отслеживать индекс цикла for. поэтому каждый поток знает, когда он не работает. но что касается этого кода, я хотел бы спросить еще о двух вещах.
Во-первых, на моем компьютере, когда я установил индекс цикла for на 350, у меня было нарушение прав доступа. 310 было количество петель, что было в порядке. поэтому я понял, что существует максимальное количество создаваемых потоков. как я могу определить это число? во-вторых, в Visual Studio 2008 выпускная версия кода демонстрировала действительно странное поведение. без использования условных переменных (строки с 1 по 3 были закомментированы) потоки были упорядочены. как это могло произойти?

вот код:

#include <iostream>
#include <Windows.h>
#include <boost/thread.hpp>

using namespace std;

boost::mutex mutexA;
boost::mutex mutexB;
boost::mutex mutexC;
boost::mutex mutexD;


class cl
{
public:
    boost::condition_variable con;
    boost::mutex mutex_cl;
    char Letter;
    int num;
    cl(char letter) : Letter(letter) , num(0)
    {

    }
    void doWork( int index, int tracknum)
    {
        boost::unique_lock<boost::mutex> lock(mutex_cl);
        while(num != tracknum)     // line 1
            con.wait(lock);   // line 2 
        Sleep(10);
        num = index;
        cout << Letter<<index << endl; 
        con.notify_all();  // line 3
    }
};

int main(int argc , char * argv[])
{
    cl A('A');
    cl B('B');
    cl C('C');
    cl D('D');

    for(int i = 0; i < 100; i++)
    {   
        boost::thread(&cl::doWork,&A,i+1,i);
        boost::thread(&cl::doWork,&B,i+1,i);
        boost::thread(&cl::doWork,&C,i+1,i);
        boost::thread(&cl::doWork,&D,i+1,i);
    }
    cout << "************************************************************************" << endl;

    Sleep(6000);
    system("PAUSE");
  return 0;
}
5
задан Andrew Barber 3 October 2013 в 15:14
поделиться