我有一个问题,我在后台线程中更新多对多关系,这在那个threa中运行正常,但是当我将对象发送回主线程时,更改不会显示.如果我关闭应用程序并重新打开数据保存正常,更改显示在主线程上.使用[context lock]而不是使用不同的托管对象上下文也可以正常工作.
我试过NSManagedObjectContext:
- (BOOL)save:(NSError **)error;
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;
Run Code Online (Sandbox Code Playgroud)
在整个过程的不同阶段,但它似乎没有帮助.
我的核心数据代码使用以下getter来确保任何操作都是线程安全的:
- (NSManagedObjectContext *) managedObjectContext
{
NSThread * thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
//Main thread just return default context
return managedObjectContext;
}
else
{
//Thread safe trickery
NSManagedObjectContext * threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:CONTEXT_KEY];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease];
[threadManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:CONTEXT_KEY];
}
return threadManagedObjectContext;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在使用的线程之间传递对象时
-(NSManagedObject*)makeSafe:(NSManagedObject*)object
{
if ([object managedObjectContext] …Run Code Online (Sandbox Code Playgroud) 有人可以解释一下boost :: upgrade_lock的正确用法.以下代码导致死锁
//Global
typedef boost::shared_mutex Mutex;
typedef boost::shared_lock<Mutex> ReadLock;
typedef boost::upgrade_lock<Mutex> UpgradeLock;
typedef boost::upgrade_to_unique_lock<Mutex> WriteLock;
Mutex sharedMutex;
//Multi threaded reader and writer
{
ReadLock read(sharedMutex);
for (int ii = 0; ii < vec.size(); ++ii) {
Element e = vec[ii];
if (e.needsUpdating()) {
UpgradeLock upgrade(sharedMutex);
WriteLock write(upgrade)
//Do stuff
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在升级之前用read.unlock()解锁读锁,它不会死锁.但似乎这不应该是必要的吗?
我想从工作线程发送一个对象回到主线程.但是,自动释放池是否在线程之间工作?以下代码有什么问题:
-(void)mainThreadReceiveResult:(id)response
{
[response retain];
/* Do some stuff with response */
[response release];
}
-(void)workerThreadDoWork
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
response * response = [[[response alloc] init] autorelease];
response->someData = [self getSomeData];
[delegate performSelectorOnMainThread:@selector(receiveResult:) withObject:response waitUntilDone:NO];
[pool release];
}
Run Code Online (Sandbox Code Playgroud)
似乎工作正常.但是[pool release],在主线程能够保留之前,工作线程是否可以到达?
将Point2D.Double x距离移近另一个Point2D.Double的最佳方法是什么?
编辑:尝试编辑,但所以进行维护.不,这不是功课
我需要将一个平面(A)移向跑道(C)的末端并将其指向正确的方向(角度a).
alt text http://img246.imageshack.us/img246/9707/planec.png
这是我到目前为止所拥有的,但它看起来很混乱,通常的做法是什么?
//coordinate = plane coordinate (Point2D.Double)
//Distance = max distance the plane can travel in this frame
Triangle triangle = new Triangle(coordinate, new Coordinate(coordinate.x, landingCoordinate.y), landingCoordinate);
double angle = 0;
//Above to the left
if (coordinate.x <= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
{
angle = triangle.getAngleC();
coordinate.rotate(angle, distance);
angle = (Math.PI-angle);
}
//Above to the right
else if (coordinate.x >= landingCoordinate.x && coordinate.y <= landingCoordinate.y)
{
angle = triangle.getAngleC();
coordinate.rotate(Math.PI-angle, distance);
angle = …Run Code Online (Sandbox Code Playgroud) 假设我有一个父实体,每个实体都有许多子节点.我想让所有的父母按孩子的数量排序.类似于以下伪代码的东西:
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext];
[[NSSortDescriptor alloc] initWithKey:@"children.count" ascending:NO];
//Execute request
Run Code Online (Sandbox Code Playgroud)
有没有办法使用核心数据构建这样的提取?如果没有办法做到这一点,将使用sortedArrayUsingSelector:_PFBatchFaultingArray批量大小的好处进行排序?
谢谢,本
如何将指向成员函数的指针传递给std :: list.sort()?
这可能吗?谢谢
struct Node {
uint32_t ID;
char * Value;
};
class myClass {
private:
uint32_t myValueLength;
public:
list<queueNode *> MyQueue;
bool compare(Node * first, Node * second);
bool doStuff();
}
bool myClass::compare(Node * first, Node * second) {
unsigned int ii =0;
while (ii < myValueLength)
{
if (first-> Value[ii] < second-> Value[ii])
{
return true;
} else if (first-> Value[ii] > second-> Value[ii])
{
return false;
}
++ii;
}
return false;
}
bool myClass::doStuff()
{
list.sort(compare); …Run Code Online (Sandbox Code Playgroud) 是否有推荐的方法来等待多个输入.例如,我希望我的程序能够从3个来源接收输入:
监听线程条件,例如pthread_cond_wait()
从标准输入获取数据,例如getline()
听套接字例如accept()
完成此任务的最佳方法是什么?我是否需要为每个不同的输入源提供一个线程?谢谢
我知道iphone上的OpenGL纹理需要2的强大功能,OpenGL 2.0也是如此吗?如果我有一个尺寸为320 x 480的图像并想要全屏绘制,那么使用OpenGL可以做到这一点.
谢谢
int main()
{
char myString = NULL;
realloc(&myString, 5);
strncpy((char *)&myString, "test", 5);
}
Run Code Online (Sandbox Code Playgroud)
似乎工作正常,但我仍然有点困惑堆栈与堆,这是允许的吗?myString是否需要手动释放,还是在超出范围时释放?
编辑:感谢您的回复,所以我认为这同样是非法的
//I want the code to change myString to "tests"
char myString[5] = "test";
realloc(&myString, strlen(myString)+2);
myString[4] = 's';
myString[5] = '\0';
Run Code Online (Sandbox Code Playgroud) 基本上我想将指针的地址存储在缓冲区中.不要问我为什么
char * buff = "myBuff";
char * myData = (char*)malloc(sizeof(char*));
int addressOfArgTwo = (unsigned int)buff;
memcpy(myData, &addressOfArgTwo, sizeof(char*));
cout << "Int Val: " << addressOfArgTwo << endl;
cout << "Address in buffer:" << (unsigned int)*myData << endl;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么上面的代码不起作用.它输出:
Int Val: 4472832
Address in buffer:0
Run Code Online (Sandbox Code Playgroud)
当缓冲区中的Int Val和Address应该相同时.谢谢