fileOne.bat
SET varTest=5
START fileTwo.bat
SET varTest=8
PAUSE
fileTwo.bat
ECHO %varTest%
多个批处理文件是否访问/设置相同的共享/全局变量“线程安全”?
答案 0 :(得分:2)
是。 filetwo.bat
以fileone.bat
的环境副本开头。
然而,由于第二个文件是start
,因此这两个过程非常独立。他们不共享环境,因此fileone.bat
中的变量对filetwo.bat
中的变量不可见,filetwo.bat
的环境也无法从fileone.bat
看到}。
如果filetwo.bat
call
来自fileone.bat
而不是start
,那么filetwo.bat
将需要在fileone.bat
继续之前完成。 filetwo.bat
一旦fileone.bat
恢复后,fileone.bat
所做的任何更改都会显示在其中。
如果您想在call
内使用setlocal
,则可以停止filetwo.bat
的此行为。 filetwo.bat
setlocal
之前的fileone.bat
所做的任何更改都将显示在setlocal
,但filetwo.bat
之后所做的任何更改都将在endlocal
终止时撤消,或者遇到fileone.bat
指令(之后所做的任何更改都会在#include<iostream>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/objdetect/objdetect.hpp>
#include<Windows.h>
#include <sstream>
using namespace cv;
using namespace std;
void on_trackbar(int, void*);
void createTrackbars();
void morphit(Mat &img);
void toggle(int);
const int MAX_NUM_OBJECTS = 500;
const int FRAME_WIDTH = 900;
const int FRAME_HEIGHT = 600;
const int MIN_OBJECT_AREA = 20 * 20;
const int MAX_OBJECT_AREA = FRAME_HEIGHT*FRAME_WIDTH / 1.5;
Point middle;
int l_MIN = 30;
int l_MAX = 165;
int a_MIN = 139;
int a_MAX = 165;
int b_MIN = 136;
int b_MAX = 172;
int kerode = 2;
int kdilate = 5;
bool domorph = true;
bool showchangedframe = true;
int main(int argc, char** argv)
{
createTrackbars();
on_trackbar(0, 0);
int x, y;
Mat frame, labframe, rangeframe;
Mat newframe, newrf;
int key;
//VideoCapture cap(0);
while ((key = waitKey(30)) != 27)
{
toggle(key);
frame = imread(argv[1], 1);
newframe = imread(argv[1], 1);
//cap >> frame;
//cap >> newframe;
//flip(frame, frame, 180);
//flip(newframe, newframe, 180);
newframe = Scalar(0, 0, 0);
cvtColor(frame, labframe, COLOR_BGR2Lab);
inRange(labframe, Scalar(l_MIN, a_MIN, b_MIN), Scalar(l_MAX, a_MAX, b_MAX), rangeframe);
newrf = rangeframe.clone();
int largest_area = 0;
int largest_contour_index = 0;
vector<vector<Point> > contours;
findContours(newrf, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
vector<Moments> mu(contours.size()); //get moments
for (int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], false);
}
vector<Point2f> mc(contours.size()); //get centers
for (int i = 0; i < contours.size(); i++)
{
mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
}
for (int i = 0; i < contours.size(); i++) //iterate through each contour.
{
double a = contourArea(contours[i], false); //Find the area of contour
if (a>largest_area)
{
largest_area = a;
largest_contour_index = i; //Store the index of largest contour
}
}
drawContours(newframe, contours, largest_contour_index, CV_RGB(255, 0, 0), CV_FILLED);
circle(newframe, mc[largest_contour_index], 5, CV_RGB(255, 255, 0), -1, 8, 0);
imshow("Detected", newframe);
if (showchangedframe)
imshow("Camera", frame);
else
imshow("Camera", rangeframe);
}
}
void on_trackbar(int, void*)
{
if (kerode == 0)
kerode = 1;
if (kdilate == 0)
kdilate = 1;
}
void createTrackbars()
{
String trackbarWindowName = "TrackBars";
namedWindow(trackbarWindowName, WINDOW_NORMAL);
createTrackbar("l_MIN", trackbarWindowName, &l_MIN, l_MAX, on_trackbar);
createTrackbar("l_MAX", trackbarWindowName, &l_MAX, l_MAX, on_trackbar);
createTrackbar("a_MIN", trackbarWindowName, &a_MIN, a_MAX, on_trackbar);
createTrackbar("a_MAX", trackbarWindowName, &a_MAX, a_MAX, on_trackbar);
createTrackbar("b_MIN", trackbarWindowName, &b_MIN, b_MAX, on_trackbar);
createTrackbar("b_MAX", trackbarWindowName, &b_MAX, b_MAX, on_trackbar);
createTrackbar("Erosion", trackbarWindowName, &kerode, 31, on_trackbar);
createTrackbar("Dilation", trackbarWindowName, &kdilate, 31, on_trackbar);
}
void morphit(Mat &img)
{
erode(img, img, getStructuringElement(MORPH_RECT, Size(kerode, kerode)));
dilate(img, img, getStructuringElement(MORPH_RECT, Size(kdilate, kdilate)));
}
void toggle(int key)
{
if (key == 'r')
showchangedframe = !showchangedframe;
}
中显示)
答案 1 :(得分:1)
有两个选项
两个批处理文件都在同一个cmd.exe
实例中运行:为此,其中一个批处理文件正在等待另一个批处理文件结束,因此,没有任何对该变量的并发访问权限。
每个批处理文件都在不同的cmd.exe
实例中运行:每个实例都有自己的环境,因此,没有任何对该变量的并发访问权。
这意味着在同一时间内读取/写入相同变量没有任何问题,因为这不会发生。